diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt index 28f195ee05..a6d1a9fc02 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumBannerAdapter.kt @@ -18,6 +18,8 @@ class ForumBannerAdapter( private var countAndKey: Pair? = 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() } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt index c5f4a634ff..3432570c30 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt @@ -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() 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) { + 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) { + 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) { + 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) { + 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++ diff --git a/app/src/main/res/layout/fragment_forum_activity.xml b/app/src/main/res/layout/fragment_forum_activity.xml index c3d3b037ff..7405280fbd 100644 --- a/app/src/main/res/layout/fragment_forum_activity.xml +++ b/app/src/main/res/layout/fragment_forum_activity.xml @@ -17,7 +17,7 @@