fix:修复社区-论坛滑动轮播图闪退问题

(cherry picked from commit eb91e53a7b)
This commit is contained in:
lyr
2022-06-16 10:01:31 +08:00
committed by 刘贻荣
parent 56e5fb6a40
commit 9eb1bc5f4d
3 changed files with 75 additions and 53 deletions

View File

@ -18,6 +18,8 @@ class ForumBannerAdapter(
private var countAndKey: Pair<Int, String>? = null
private var mIsInfiniteLoop = getDataSize() != 1
init {
var dataIds = ""
mList.forEach {
@ -26,8 +28,6 @@ class ForumBannerAdapter(
if (dataIds.isNotEmpty()) countAndKey = Pair(mList.size, dataIds)
}
private var mIsInfiniteLoop = getDataSize() != 1
private fun getDataSize() = mList.size
fun getRealPosition(position: Int) =
@ -64,6 +64,8 @@ class ForumBannerAdapter(
}
mList = update
mIsInfiniteLoop = getDataSize() != 1
if (countAndKey?.first != update.size || countAndKey?.second != dataIds) {
notifyDataSetChanged()
}

View File

@ -45,8 +45,9 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
private var mHaveHotForum = false
private var mIsFirst = true
private var mIsAutoScroll = true
private var isBannerSizeMoreThanOne = false
private var mIsBannerSizeMoreThanOne = false
private var mIsLogin = CheckLoginUtils.isLogin()
private var mBanners = listOf<ForumBannerEntity>()
var translationY = 0
override fun getRealLayoutId(): Int {
@ -90,7 +91,8 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
})
mViewModel?.banners?.observeNonNull(viewLifecycleOwner) {
if (it.isNotEmpty()) initBanners(it)
mBanners = it
initBanners()
}
mViewModel?.followForumsLiveData?.observe(viewLifecycleOwner, Observer {
@ -172,7 +174,7 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
activity?.intent?.putExtra(BbsStayTimeHelper.IS_BBS_CONTENT_VISIBLE, true)
BbsStayTimeHelper.resumeTimeCount()
if (isBannerSizeMoreThanOne) {
if (mIsBannerSizeMoreThanOne) {
mIsAutoScroll = true
mBinding?.bannerViewPager?.startAutoScroll()
}
@ -186,7 +188,7 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
activity?.intent?.putExtra(BbsStayTimeHelper.IS_BBS_CONTENT_VISIBLE, false)
BbsStayTimeHelper.pauseTimeCount()
if (isBannerSizeMoreThanOne) {
if (mIsBannerSizeMoreThanOne) {
mIsAutoScroll = false
mBinding?.bannerViewPager?.stopAutoScroll()
}
@ -220,13 +222,17 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
mBinding?.refreshLayout?.isRefreshing = false
}
private fun initBanners(list: List<ForumBannerEntity>) {
private fun initBanners() {
mBinding?.apply {
if (mBanners.isEmpty()) {
bannerContainer.visibility = View.GONE
return
}
bannerContainer.visibility = View.VISIBLE
mIsBannerSizeMoreThanOne = mBanners.size > 1
if (bannerViewPager.adapter != null) {
(bannerViewPager.adapter as? ForumBannerAdapter)?.checkResetData(list)
(bannerViewPager.adapter as? ForumBannerAdapter)?.checkResetData(mBanners)
} else {
isBannerSizeMoreThanOne = list.size > 1
val rootWidth = resources.displayMetrics.widthPixels - (16F + 16F).dip2px()
bannerContainer.layoutParams = bannerContainer.layoutParams.apply {
height = rootWidth / 2 + (38F + 8F + 8F).dip2px()
@ -235,59 +241,73 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
height = rootWidth / 2
}
initBannerViewpager(list)
initBannerIndicator(list)
initBannerViewpager()
}
if (indicatorContainer.childCount != mBanners.size) {
updateViewpagerConfig()
initBannerIndicator()
}
}
}
private fun initBannerViewpager(list: List<ForumBannerEntity>) {
private fun initBannerViewpager() {
mBinding?.bannerViewPager?.run {
adapter = ForumBannerAdapter(requireContext(), list)
changeBannerItem(list[0], 0, true)
if (isBannerSizeMoreThanOne) {
currentItem = list.size * 10
adapter = ForumBannerAdapter(requireContext(), mBanners)
doOnScroll(
onPageSelected = { position ->
if (!mIsBannerSizeMoreThanOne) return@doOnScroll
val realPosition = (adapter as ForumBannerAdapter).getRealPosition(position)
changeBannerItem(mBanners[realPosition], realPosition)
},
onPageScrolled = { position, positionOffset, _ ->
if (!mIsBannerSizeMoreThanOne) return@doOnScroll
val currentPosition = (adapter as ForumBannerAdapter).getRealPosition(position)
val nextPosition = (adapter as ForumBannerAdapter).getRealPosition(position + 1)
val currentColor =
mBanners.safelyGetInRelease(currentPosition)?.placeholderColor?.hexStringToIntColor(
R.color.background_white.toColor(requireContext())
) ?: R.color.background_white.toColor(requireContext())
val nextColor =
mBanners.safelyGetInRelease(nextPosition)?.placeholderColor?.hexStringToIntColor(
R.color.background_white.toColor(requireContext())
) ?: R.color.background_white.toColor(requireContext())
val colorInBetween = if (currentColor == nextColor) {
currentColor
} else {
ColorUtils.blendARGB(currentColor, nextColor, positionOffset)
}
changeBannerBg(colorInBetween)
}
)
setBannerViewPagerListener()
}
}
private fun updateViewpagerConfig() {
mBinding?.bannerViewPager?.run {
changeBannerItem(mBanners[0], 0, true)
if (mIsBannerSizeMoreThanOne) {
setCurrentItem(mBanners.size * 10, false)
currentItem = mBanners.size * 10
interval = 3000L
startAutoScroll()
doOnScroll(
onPageSelected = { position ->
val realPosition = (adapter as ForumBannerAdapter).getRealPosition(position)
changeBannerItem(list[realPosition], realPosition)
},
onPageScrolled = { position, positionOffset, _ ->
val currentPosition = (adapter as ForumBannerAdapter).getRealPosition(position)
val nextPosition = (adapter as ForumBannerAdapter).getRealPosition(position + 1)
val currentColor =
list.safelyGetInRelease(currentPosition)?.placeholderColor?.hexStringToIntColor(
R.color.background_white.toColor(requireContext())
) ?: R.color.background_white.toColor(requireContext())
val nextColor =
list.safelyGetInRelease(nextPosition)?.placeholderColor?.hexStringToIntColor(
R.color.background_white.toColor(requireContext())
) ?: R.color.background_white.toColor(requireContext())
val colorInBetween = if (currentColor == nextColor) {
currentColor
} else {
ColorUtils.blendARGB(currentColor, nextColor, positionOffset)
}
changeBannerBg(colorInBetween)
}
)
} else {
currentItem = 0
stopAutoScroll()
}
setBannerViewPagerListener(list)
}
}
@SuppressLint("ClickableViewAccessibility")
private fun setBannerViewPagerListener(list: List<ForumBannerEntity>) {
private fun setBannerViewPagerListener() {
mBinding?.bannerViewPager?.run {
setOnTouchListener { _, event ->
if (list.isNotEmpty() && mIsAutoScroll) {
if (mIsBannerSizeMoreThanOne && mIsAutoScroll) {
if (event.action == MotionEvent.ACTION_DOWN || event.action == MotionEvent.ACTION_MOVE) {
stopAutoScroll()
} else {
@ -299,12 +319,12 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener {
}
}
private fun initBannerIndicator(list: List<ForumBannerEntity>) {
private fun initBannerIndicator() {
mBinding?.run {
if (isBannerSizeMoreThanOne) {
indicatorContainer.removeAllViews()
indicatorContainer.removeAllViews()
if (mIsBannerSizeMoreThanOne) {
var i = 0
val size = list.size
val size = mBanners.size
while (i < size) {
indicatorContainer.addView(getBannerIndicatorItemView(i))
i++