feat : 首页 第二banner

This commit is contained in:
eggmanQQQ
2024-11-07 18:36:33 +08:00
parent e5794630c7
commit 2a3d716332
7 changed files with 240 additions and 124 deletions

View File

@@ -3,7 +3,11 @@ package com.chwl.app.home
import androidx.lifecycle.MutableLiveData
import com.chwl.app.base.BaseViewModel
import com.chwl.core.bean.response.ListResult
import com.chwl.core.home.bean.*
import com.chwl.core.home.bean.BannerInfo
import com.chwl.core.home.bean.CurrentResourceInfo
import com.chwl.core.home.bean.HomeRankBean
import com.chwl.core.home.bean.HomeRoomInfo
import com.chwl.core.home.bean.HomeTagInfo
import com.chwl.core.home.model.HomeModel
import com.chwl.core.room.bean.AnchorInfo
import com.chwl.core.utils.extension.toast
@@ -13,6 +17,7 @@ class HomeViewModel : BaseViewModel() {
val tabRoomListLiveData = MutableLiveData<ListResult<HomeRoomInfo>?>()
val bannerLiveData = MutableLiveData<List<BannerInfo>?>()
val secondBannerLiveData = MutableLiveData<List<BannerInfo>?>()
val homeResourceLiveData = MutableLiveData<List<CurrentResourceInfo>?>()
@@ -76,6 +81,17 @@ class HomeViewModel : BaseViewModel() {
)
}
fun getSecondBannerInfo() {
safeLaunch(
onError = {
secondBannerLiveData.value = null
},
block = {
secondBannerLiveData.value = HomeModel.getHomeSecondBanner("1")
}
)
}
fun getHomeTabInfo() {
safeLaunch {
homeTabLiveData.value = HomeModel.getNewHomeTab()

View File

@@ -15,6 +15,8 @@ import com.chwl.app.ui.utils.ImageLoadUtils
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.utils.loadAnim
import com.chwl.app.ui.utils.loadFromAssets
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil
import com.chwl.core.home.bean.BannerInfo
import com.chwl.core.home.bean.HomeRoomInfo
import com.chwl.library.common.util.isVerify
import com.chwl.library.common.util.setVis
@@ -23,6 +25,7 @@ import com.example.lib_utils.UiUtils
import com.opensource.svgaplayer.SVGADrawable
import com.opensource.svgaplayer.SVGAImageView
import com.tencent.qgame.animplayer.AnimView
import com.zhpan.bannerview.BannerViewPager
/**
* create by lvzebiao @2019/11/13
@@ -43,99 +46,124 @@ class HomeRoomAdapter : BaseMultiItemQuickAdapter<HomeRoomInfo, BaseViewHolder>
override fun onCreateDefViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
return super.onCreateDefViewHolder(parent, viewType).apply {
val micUserRecyclerView = this.getView<RecyclerView>(R.id.recycler_view_users)
micUserRecyclerView.setOnTouchListener { v, event -> true }
micUserRecyclerView.setRecycledViewPool(micUserItemViewPool)
micUserRecyclerView.setHasFixedSize(true)
micUserRecyclerView.layoutManager =
LinearLayoutManager(parent.context, RecyclerView.HORIZONTAL, false).apply {
this.recycleChildrenOnDetach = true
this.isSmoothScrollbarEnabled
}
micUserRecyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
val offset = AppUtils.getApp().resources.getDimensionPixelOffset(R.dimen.dp_4) * -1
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val position = parent.getChildAdapterPosition(view)
if (position != 0) {
if (isRTL) {
outRect.right = offset
} else {
outRect.left = offset
if (viewType == HomeRoomInfo.TYPE_ROOM) {
val micUserRecyclerView = this.getView<RecyclerView>(R.id.recycler_view_users)
micUserRecyclerView.setOnTouchListener { v, event -> true }
micUserRecyclerView.setRecycledViewPool(micUserItemViewPool)
micUserRecyclerView.setHasFixedSize(true)
micUserRecyclerView.layoutManager =
LinearLayoutManager(parent.context, RecyclerView.HORIZONTAL, false).apply {
this.recycleChildrenOnDetach = true
this.isSmoothScrollbarEnabled
}
micUserRecyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
val offset =
AppUtils.getApp().resources.getDimensionPixelOffset(R.dimen.dp_4) * -1
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val position = parent.getChildAdapterPosition(view)
if (position != 0) {
if (isRTL) {
outRect.right = offset
} else {
outRect.left = offset
}
}
}
}
})
micUserRecyclerView.adapter = HomeRoomUserAdapter()
})
micUserRecyclerView.adapter = HomeRoomUserAdapter()
} else if(viewType == HomeRoomInfo.TYPE_BANNER) {
val banner = this.getView<BannerViewPager<BannerInfo>>(R.id.banner_view)
banner.adapter = HomeBannerAdapter()
}
}
}
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_online_number, item.onlineNum.toString())
setText(R.id.tv_room_title, item.title)
setText(R.id.tv_desc, item.roomDesc)
}
val flag = helper.getView<ImageView>(R.id.flag)
if (item.regionFlag.isVerify()) {
flag.load(item.regionFlag)
}
flag.setVis(item.regionFlag.isVerify())
val micUserRecyclerView = helper.getView<RecyclerView>(R.id.recycler_view_users)
val userAdapter = micUserRecyclerView.adapter as HomeRoomUserAdapter
userAdapter.setNewData(item.micUsers)
val topView = helper.getView<ImageView>(R.id.iv_top)
if (item.isHourTop1 == 1) {
topView.setImageResource(R.drawable.home_room_bg_hour_top)
topView.visibility = View.VISIBLE
} else if (item.isWeekTop1 == 1) {
topView.setImageResource(R.drawable.home_room_bg_week_top)
topView.visibility = View.VISIBLE
} else {
topView.visibility = View.INVISIBLE
}
val tagPict = item.tagPict
val tagView = helper.getView<ImageView>(R.id.iv_tag)
if (tagPict.isNullOrEmpty()) {
tagView.isVisible = false
} else {
ImageLoadUtils.loadImage(tagView, tagPict)
tagView.isVisible = true
}
val pkView = helper.getView<SVGAImageView>(R.id.svga_pk)
if (item.isCrossPking) {
pkView.isVisible = true
if (pkView.drawable !is SVGADrawable) {
pkView.loadFromAssets("svga/home_pk.svga")
if (!item.isBanner) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_online_number, item.onlineNum.toString())
setText(R.id.tv_room_title, item.title)
setText(R.id.tv_desc, item.roomDesc)
}
pkView.startAnimation()
} else {
pkView.isVisible = false
pkView.stopAnimation()
}
val boomIcon = helper.getView<ImageView>(R.id.boomIcon)
val boomAnim = helper.getView<AnimView>(R.id.boomAnim)
boomIcon.setVis(false)
boomAnim.setVis(false)
if (item.isRoomBoom) {
if (item.roomBoomPic.isVerify()) {
boomIcon.load(item.roomBoomPic)
boomIcon.setVis(true)
}else if (item.roomBoomVapUrl.isVerify()){
boomAnim.loadAnim(item.roomBoomVapUrl)
boomAnim.setVis(true)
val flag = helper.getView<ImageView>(R.id.flag)
if (item.regionFlag.isVerify()) {
flag.load(item.regionFlag)
}
flag.setVis(item.regionFlag.isVerify())
val micUserRecyclerView = helper.getView<RecyclerView>(R.id.recycler_view_users)
val userAdapter = micUserRecyclerView.adapter as HomeRoomUserAdapter
userAdapter.setNewData(item.micUsers)
val topView = helper.getView<ImageView>(R.id.iv_top)
if (item.isHourTop1 == 1) {
topView.setImageResource(R.drawable.home_room_bg_hour_top)
topView.visibility = View.VISIBLE
} else if (item.isWeekTop1 == 1) {
topView.setImageResource(R.drawable.home_room_bg_week_top)
topView.visibility = View.VISIBLE
} else {
topView.visibility = View.INVISIBLE
}
val tagPict = item.tagPict
val tagView = helper.getView<ImageView>(R.id.iv_tag)
if (tagPict.isNullOrEmpty()) {
tagView.isVisible = false
} else {
ImageLoadUtils.loadImage(tagView, tagPict)
tagView.isVisible = true
}
val pkView = helper.getView<SVGAImageView>(R.id.svga_pk)
if (item.isCrossPking) {
pkView.isVisible = true
if (pkView.drawable !is SVGADrawable) {
pkView.loadFromAssets("svga/home_pk.svga")
}
pkView.startAnimation()
} else {
pkView.isVisible = false
pkView.stopAnimation()
}
val boomIcon = helper.getView<ImageView>(R.id.boomIcon)
val boomAnim = helper.getView<AnimView>(R.id.boomAnim)
boomIcon.setVis(false)
boomAnim.setVis(false)
if (item.isRoomBoom) {
if (item.roomBoomPic.isVerify()) {
boomIcon.load(item.roomBoomPic)
boomIcon.setVis(true)
}else if (item.roomBoomVapUrl.isVerify()){
boomAnim.loadAnim(item.roomBoomVapUrl)
boomAnim.setVis(true)
}
}
} else {
if (item.bannerVoList.isVerify()){
val banner = helper.getView<BannerViewPager<BannerInfo>>(R.id.banner_view)
banner.setPageMargin(UIUtil.dip2px(mContext, 8.0))
.setScrollDuration(800)
.create(item.bannerVoList)
//
// val clickView = helper.getView<View>(R.id.banner_view_click)
// clickView.click {
// val position = banner.currentItem
// CommonJumpHelper.bannerJump(banner.context, item.bannerVoList[position])
// }
}
}
}

View File

@@ -1,15 +1,16 @@
package com.chwl.app.home.fragment
import android.util.SparseArray
import android.view.View
import android.widget.LinearLayout
import androidx.core.view.isVisible
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import androidx.viewpager2.adapter.FragmentStateAdapter
import com.chwl.app.R
import com.chwl.app.application.IReportConstants
import com.chwl.app.application.ReportManager
@@ -25,13 +26,13 @@ import com.chwl.app.ui.search.SearchActivity
import com.chwl.app.ui.user.adapter.HomeRecommendIndicatorAdapter
import com.chwl.app.ui.utils.load
import com.chwl.app.ui.webview.CommonWebViewActivity
import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper
import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil
import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.chwl.app.utils.CommonJumpHelper
import com.chwl.core.DemoCache
import com.chwl.core.home.bean.BannerInfo
import com.chwl.core.home.bean.HomeTagInfo
import com.chwl.library.common.util.isVerify
import com.chwl.library.utils.ListUtils
import com.example.lib_utils.ktx.getDrawableById
import com.zhpan.bannerview.BannerViewPager
@@ -45,7 +46,10 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
View.OnClickListener {
private val tabList = mutableListOf<HomeTagInfo>()
private var mPosition = 0
private val homeViewModel: HomeViewModel by activityViewModels()
private val fragmentArray = SparseArray<Fragment>()
private var tempFragment: Fragment? = null
override fun init() {
initListener()
@@ -72,7 +76,7 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
}
homeViewModel.getHomeRankList()
homeViewModel.getBannerInfo()
if (binding.viewPager.adapter?.itemCount == 0) {
if (!tabList.isVerify()){
homeViewModel.getHomeTabInfo()
}
}
@@ -133,8 +137,7 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
}
private fun initBanner() {
val bannerView: BannerViewPager<BannerInfo?> =
binding.bannerView as BannerViewPager<BannerInfo?>
val bannerView: BannerViewPager<BannerInfo?> = binding.bannerView as BannerViewPager<BannerInfo?>
homeViewModel.bannerLiveData.observe(this) {
it?.let {
if (ListUtils.isListEmpty(it)) {
@@ -185,28 +188,7 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
}
private fun initTab() {
binding.viewPager.adapter =
object : FragmentStateAdapter(childFragmentManager, lifecycle) {
override fun getItemId(position: Int): Long {
return tabList[position].id.toLong()
}
override fun containsItem(itemId: Long): Boolean {
return tabList.firstOrNull { it.id.toLong() == itemId } != null
}
override fun createFragment(position: Int): Fragment {
val itemId = getItemId(position)
return HomeTabRoomFragment.newInstance(itemId.toInt()).apply {
this.autoRefreshOnVisible = true
}
}
override fun getItemCount(): Int {
return tabList.size
}
}
ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager)
homeViewModel.homeTabLiveData.observe(this) {
loadTabList(transformTabList(it))
}
@@ -222,7 +204,10 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
list
)
magicIndicatorAdapter.setOnItemSelectListener { position, _ ->
binding.viewPager.currentItem = position
// ToastUtils.show("选择 ${tabList.get(position).name}")
binding.magicIndicator.onPageSelected(position)
mPosition = position
changePage()
}
commonNavigator.adapter = magicIndicatorAdapter
binding.magicIndicator.navigator = commonNavigator
@@ -230,7 +215,8 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
titleContainer.dividerPadding = resources.getDimensionPixelOffset(R.dimen.dp_15)
titleContainer.dividerDrawable = getDrawableById(R.drawable.home_recommend_tab_splitter)
binding.magicIndicator.onPageSelected(binding.viewPager.currentItem)
changePage()
// binding.magicIndicator.onPageSelected(binding.viewPager.currentItem)
}
private fun transformTabList(list: List<HomeTagInfo>): List<HomeTagInfo> {
@@ -249,10 +235,36 @@ class HomeRecommendFragment : BaseViewBindingFragment<FragmentHomeRecommendBindi
}
tabList.clear()
tabList.addAll(newList)
binding.viewPager.adapter?.notifyDataSetChanged()
fragmentArray.clear()
if (tabList.isVerify()) {
tabList.forEach {
fragmentArray.put(it.id,HomeTabRoomFragment.newInstance(it.id))
}
}
// binding.viewPager.adapter?.notifyDataSetChanged()
resetTabIndicator(tabList.map { it.name })
}
private fun changePage() {
val showFragment = fragmentArray.get(tabList.get(mPosition).id)
if (showFragment === tempFragment) return
val transaction: FragmentTransaction = childFragmentManager.beginTransaction()
if (!showFragment.isAdded) {
transaction.add(R.id.view_pager, showFragment, null)
}
transaction.show(showFragment)
if (tempFragment != null) {
transaction.hide(tempFragment!!)
}
tempFragment = showFragment
if (!isDetached) {
transaction.commitNowAllowingStateLoss()
}
}
override fun onDestroyView() {
super.onDestroyView()
tabList.clear()

View File

@@ -16,6 +16,8 @@ import com.chwl.app.home.adapter.HomeRoomAdapter
import com.chwl.app.support.FragmentVisibleStateHelper
import com.chwl.app.ui.utils.RVDelegate
import com.chwl.core.home.bean.HomeRoomInfo
import com.chwl.library.common.util.isVerify
import com.chwl.library.utils.ListUtils
/**
* 首页-房间列表
@@ -30,6 +32,7 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
private val homeViewModel: HomeViewModel by viewModels()
var autoRefreshOnVisible = false
var isLoadBanner = false
private var pageNum = 1
private val pageSize = 50
@@ -87,9 +90,42 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
loadData(false)
}, binding.mRecyclerRoom)
homeViewModel.tabRoomListLiveData.observe(this) {
if (pageNum == 1){
isLoadBanner = true
homeViewModel.getSecondBannerInfo()
}
rvDelegate.loadData(it)
}
homeViewModel.secondBannerLiveData.observe(this){
it?.let {
if (ListUtils.isListEmpty(it)) {
isLoadBanner = false
return@let
}
val newData = adapter.data.toMutableList()
if (newData.isVerify()) {
val homeRoomInfo = HomeRoomInfo().apply {
isBanner = true
bannerVoList = it
}
if (newData.size >= 6) {
newData.add(5,homeRoomInfo)
} else {
newData.add(homeRoomInfo)
}
adapter.setNewData(newData)
}
isLoadBanner = false
}
}
}
override fun onLazyLoad() {
@@ -98,6 +134,7 @@ class HomeTabRoomFragment : BaseViewBindingFragment<HomeTabRoomFragmentBinding>(
}
private fun loadData(isRefresh: Boolean) {
if (isLoadBanner) return
if (isRefresh) {
pageNum = 1
} else {

View File

@@ -115,7 +115,7 @@
android:layout_marginTop="@dimen/dp_8"
android:layout_marginEnd="@dimen/dp_12" />
<androidx.viewpager2.widget.ViewPager2
<FrameLayout
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"

View File

@@ -1,24 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
android:layout_height="wrap_content">
<com.zhpan.bannerview.BannerViewPager
app:layout_constraintTop_toTopOf="parent"
android:id="@+id/banner_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginHorizontal="@dimen/dp_14"
android:layout_height="@dimen/dp_118"
android:layout_marginHorizontal="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_9"
android:background="@drawable/base_shape_negative_5dp"
app:bvp_auto_play="true"
app:bvp_can_loop="true"
android:nestedScrollingEnabled="false"
app:bvp_indicator_checked_color="@color/color_9168FA"
app:bvp_indicator_normal_color="@color/color_B3B3C3"
app:bvp_indicator_radius="@dimen/dp_4"
app:bvp_indicator_visibility="visible"
app:bvp_page_style="multi_page_scale"
app:layout_constraintDimensionRatio="351:80"/>
app:layout_constraintTop_toTopOf="parent" />
<!-- <View-->
<!-- android:id="@+id/banner_view_click"-->
<!-- app:layout_constraintStart_toStartOf="@+id/banner_view"-->
<!-- app:layout_constraintEnd_toEndOf="@+id/banner_view"-->
<!-- app:layout_constraintTop_toTopOf="@+id/banner_view"-->
<!-- app:layout_constraintBottom_toBottomOf="@+id/banner_view"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="0dp"/>-->
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,13 +1,11 @@
package com.chwl.core.home.model
import com.chwl.core.R
import com.chwl.core.auth.AuthModel
import com.chwl.core.base.BaseModel
import com.chwl.core.bean.response.ServiceResult
import com.chwl.core.community.CommunityConstant
import com.chwl.core.community.bean.UnReadCountInfo
import com.chwl.core.home.bean.*
import com.chwl.core.room.bean.AnchorInfo
import com.chwl.core.room.bean.MeCenterInfo
import com.chwl.core.user.bean.DiamondGiveHistoryInfo
import com.chwl.core.user.bean.SearchUserInfo
@@ -15,7 +13,6 @@ import com.chwl.core.user.bean.UserInfo
import com.chwl.core.utils.net.RxHelper
import com.chwl.core.utils.net.launchRequest
import com.chwl.library.net.rxnet.RxNet
import com.chwl.library.utils.ResUtil
import io.reactivex.Single
import retrofit2.http.GET
import retrofit2.http.POST
@@ -75,6 +72,15 @@ object HomeModel : BaseModel() {
)
}
suspend fun getHomeSecondBanner(type: String): List<BannerInfo>? =
launchRequest {
api.apiHomeSecondBanner(
type, AuthModel.get().currentUid.toString(),
CommunityConstant.VERSION_VALID_TYPE,
AuthModel.get().ticket
)
}
suspend fun getCommonRoom(tabId: Int, pageNum: Int, pageSize: Int): List<HomeRoomInfo>? =
launchRequest {
api.getCommonRoom(tabId, pageNum, pageSize)
@@ -286,6 +292,14 @@ object HomeModel : BaseModel() {
@Query("ticket") ticket: String
): ServiceResult<List<BannerInfo>>
@GET("/home/second/banner")
suspend fun apiHomeSecondBanner(
@Query("type") type: String,
@Query("uid") uid: String,
@Query("types") types: String,
@Query("ticket") ticket: String
): ServiceResult<List<BannerInfo>>
/**
* 首页热门房间
*