@ -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()
|
||||
}
|
||||
|
||||
@ -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++
|
||||
|
||||
Reference in New Issue
Block a user