From d9e3c32f1bc8fcba83930cd6e71fbf50c2449a76 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 22 Feb 2024 14:17:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=8A=A8=E6=80=81Tab=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yizhuan/erban/home/HomeViewModel.kt | 19 ++- .../home/adapter/RoomNewFriendsAdapter.kt | 4 - .../erban/home/fragment/AccompanyFragment.kt | 6 + .../erban/home/fragment/HomeFragment.kt | 157 +++++++++++------- .../erban/home/fragment/HomeTabFragment.kt | 141 ++++++++++++++++ .../home/model/HomeModel.kt | 28 +++- 6 files changed, 280 insertions(+), 75 deletions(-) create mode 100644 app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabFragment.kt diff --git a/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt b/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt index e98052159..84f9d4626 100644 --- a/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt +++ b/app/src/main/java/com/yizhuan/erban/home/HomeViewModel.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.async class HomeViewModel : BaseViewModel() { - private val _tabHomeLiveData = MutableLiveData?>() - val tabHomeLiveData: MutableLiveData?> = _tabHomeLiveData + private val _tabHomeLiveData = MutableLiveData?>() + val tabHomeLiveData: MutableLiveData?> = _tabHomeLiveData private val _bannerLiveData = MutableLiveData?>() val bannerLiveData: MutableLiveData?> = _bannerLiveData @@ -47,6 +47,8 @@ class HomeViewModel : BaseViewModel() { private val _tagLiveData = MutableLiveData>() val tagLiveData: LiveData> = _tagLiveData + val homeTagLiveData: MutableLiveData> = MutableLiveData>() + private val _emptyLiveData = MutableLiveData() val emptyLiveData: LiveData = _emptyLiveData @@ -62,13 +64,14 @@ class HomeViewModel : BaseViewModel() { private val _newFriendLiveData = MutableLiveData>() val newFriendLiveData: LiveData> = _newFriendLiveData - fun getHomeTabName() { + fun getHomeTabName(tabId: Int, pageNum: Int) { safeLaunch( onError = { - _tabHomeLiveData.value = null + _tabHomeLiveData.value = ListResult.failed(pageNum) }, block = { - _tabHomeLiveData.value = HomeModel.getHomeTabHome() + val result = HomeModel.getHomeTabHome(tabId, pageNum, 20) + _tabHomeLiveData.value = ListResult.success(result, pageNum) } ) } @@ -122,6 +125,12 @@ class HomeViewModel : BaseViewModel() { ) } + fun getHomeTagInfo() { + safeLaunch { + homeTagLiveData.value = HomeModel.getNewHomeTag() + } + } + fun getTagInfo() { safeLaunch { _tagLiveData.value = HomeModel.getHomeTag() diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomNewFriendsAdapter.kt b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomNewFriendsAdapter.kt index 11e2ac0b3..2dd4f60f8 100644 --- a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomNewFriendsAdapter.kt +++ b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomNewFriendsAdapter.kt @@ -87,10 +87,6 @@ class RoomNewFriendsAdapter : } } - helper.getView(R.id.iv_avatar).setOnClickListener { - UserInfoActivity.Companion.start(mContext, item.uid) - } - val tvNickname = helper.getView(R.id.tv_nickname) tvNickname.text = item.nick diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/AccompanyFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/AccompanyFragment.kt index 1d1dfe8e9..6746620a8 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/AccompanyFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/AccompanyFragment.kt @@ -17,6 +17,7 @@ import com.yizhuan.erban.home.HomeViewModel import com.yizhuan.erban.home.adapter.HomeChatAdapter import com.yizhuan.erban.home.adapter.RoomNewFriendsAdapter import com.yizhuan.erban.home.helper.OpenRoomHelper +import com.yizhuan.erban.ui.user.activity.UserInfoActivity import com.yizhuan.erban.ui.utils.RVDelegate import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo import com.yizhuan.xchat_android_core.home.event.RefreshHomeDataEvent @@ -116,6 +117,11 @@ class AccompanyFragment : BaseViewBindingFragment() { private fun initHotRoomTab() { roomNewFriendsAdapter = RoomNewFriendsAdapter() + roomNewFriendsAdapter.setOnItemClickListener { adapter, view, position -> + (adapter.getItem(position) as? UserInfo)?.let { + UserInfoActivity.Companion.start(context, it.uid) + } + } rvDelegate = RVDelegate.Builder() .setAdapter(roomNewFriendsAdapter) .setRecyclerView(binding.recyclerView) diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt index 6e2ef1fac..33f17b333 100644 --- a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeFragment.kt @@ -40,20 +40,18 @@ import com.zhpan.bannerview.BannerViewPager class HomeFragment : BaseViewBindingFragment(), View.OnClickListener, MainIndicatorAdapter.OnItemSelectListener { - private val mFragments = mutableListOf>() - private val mTabInfoList = mutableListOf() + private val tabList = mutableListOf() + private val tabTitleList = mutableListOf() private val homeViewModel: HomeViewModel by activityViewModels() - private var mBanner: BannerViewPager? = null - companion object { - private const val TAG = "HomeFragment" - } - override fun init() { mBanner = view?.findViewById(R.id.banner) - initTitleTab() + initTab() initListener() + homeViewModel.homeTagLiveData.observe(this) { + loadTabList(transformTabList(it)) + } homeViewModel.bannerLiveData.observe(this) { it?.let { if (ListUtils.isListEmpty(it)) { @@ -71,7 +69,10 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic ReportManager.get().reportEvent( IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.SIX), - Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) + Pair( + IReportConstants.MODULE, + IReportConstants.PEKO_HOMEPAGE + ) ) ) CommonJumpHelper.bannerJump(context, it[position]) @@ -83,7 +84,7 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic } homeViewModel.currentResourceLiveData.observe(this) { it?.let { - if(it.size != 2){ + if (it.size != 2) { binding.csResource.visibility = View.GONE return@observe } @@ -99,10 +100,12 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic it[i].resourceType == 5 -> { CommonWebViewActivity.start(context, it[i].resourceContent) } + i == 3 -> { dialogManager.showProgressDialog(mContext) homeViewModel.getHomeChatPick() } + else -> { dialogManager.showProgressDialog(mContext) homeViewModel.getResourceJumpInfo(it[i].id) @@ -131,6 +134,7 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic } } } + homeViewModel.getHomeTagInfo() homeViewModel.getBannerInfo() homeViewModel.getCurrentResourceInfo() } @@ -157,6 +161,7 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic DemoCache.saveAnchorCardView(1) } } + R.id.iv_ranking -> { //首页_排行榜 ReportManager.get().reportEvent( @@ -167,6 +172,7 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic ) CommonWebViewActivity.start(mContext, UriProvider.getRanking()) } + R.id.iv_my_room -> { //首页_创建房间 ReportManager.get().reportEvent( @@ -180,63 +186,100 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic } } - /** - * 初始化推荐 - */ - private fun initTitleTab() { - mTabInfoList.add( - HomeTagInfo( - 6, - ResUtil.getString(R.string.home_fragment_homefragment_04), - 0 - ) - ) - mTabInfoList.add( - HomeTagInfo( - 7, - ResUtil.getString(R.string.home_fragment_homefragment_07), - 0 - ) - ) - mFragments.add(RecommendFragment::class.java) - mFragments.add(AccompanyFragment::class.java) - - val commonNavigator = CommonNavigator(context) - commonNavigator.setTitleWrapContent(false) - commonNavigator.titleMargin = ScreenUtil.dip2px(2.0F) - commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL) - val magicIndicatorAdapter = MainIndicatorAdapter(context, mTabInfoList.map { it.name }) - magicIndicatorAdapter.setOnItemSelectListener(this) - commonNavigator.adapter = magicIndicatorAdapter - binding.magicIndicator.navigator = commonNavigator - binding.viewPager.adapter = - object : FragmentStateAdapter(childFragmentManager, lifecycle) { - override fun createFragment(position: Int): Fragment { - return mFragments[position].newInstance() - } - - override fun getItemCount(): Int { - return mFragments.size - } - - } - ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager) - binding.viewPager.offscreenPageLimit = 1 - } - override fun onItemSelect(position: Int, view: TextView?) { binding.viewPager.currentItem = position //点击顶部tab上报 val map = HashMap(3) - map[IReportConstants.HOMEPAGE_TAB] = mTabInfoList[position].id + map[IReportConstants.HOMEPAGE_TAB] = tabList[position].id map[IReportConstants.MODULE] = IReportConstants.PEKO_HOMEPAGE ReportManager.get().reportEvent(IReportConstants.TAB_HOMEPAGE_CLICK, map) } override fun onDestroyView() { super.onDestroyView() - mTabInfoList.clear() - mFragments.clear() + tabList.clear() + tabTitleList.clear() } + private fun initTab() { + val commonNavigator = CommonNavigator(context) + commonNavigator.setTitleWrapContent(false) + commonNavigator.titleMargin = ScreenUtil.dip2px(2.0F) + commonNavigator.setTitleGravity(Gravity.CENTER_VERTICAL) + val magicIndicatorAdapter = MainIndicatorAdapter(context, tabTitleList) + magicIndicatorAdapter.setOnItemSelectListener(this) + commonNavigator.adapter = magicIndicatorAdapter + binding.magicIndicator.navigator = commonNavigator + 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 when (itemId) { + -1L -> { + RecommendFragment() + } + + -2L -> { + AccompanyFragment() + } + + else -> { + HomeTabFragment.newInstance(itemId.toInt()) + } + } + } + + override fun getItemCount(): Int { + return tabList.size + } + } + ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager) + loadTabList(transformTabList(emptyList())) + } + + private fun transformTabList(list: List): List { + val finalList = ArrayList() + finalList.add( + HomeTagInfo( + -1, + ResUtil.getString(R.string.home_fragment_homefragment_04), + 0 + ) + ) + finalList.addAll(list) + finalList.add( + HomeTagInfo( + -2, + ResUtil.getString(R.string.home_fragment_homefragment_07), + 0 + ) + ) + return finalList + } + + private fun loadTabList(list: List) { + // 预防脏数据导致fragment复用问题 + val newList = list.distinctBy { + it.id + } + val currentListId = tabList.joinToString { it.id.toString() } + val newListId = newList.joinToString { it.id.toString() } + if (currentListId == newListId) { + return + } + tabList.clear() + tabList.addAll(newList) + tabTitleList.clear() + tabTitleList.addAll(tabList.map { it.name }) + binding.magicIndicator.navigator.notifyDataSetChanged() + binding.viewPager.adapter?.notifyDataSetChanged() + } } \ No newline at end of file diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabFragment.kt new file mode 100644 index 000000000..f7c36755c --- /dev/null +++ b/app/src/main/java/com/yizhuan/erban/home/fragment/HomeTabFragment.kt @@ -0,0 +1,141 @@ +package com.yizhuan.erban.home.fragment + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.chad.library.adapter.base.BaseQuickAdapter +import com.yizhuan.erban.application.IReportConstants +import com.yizhuan.erban.application.ReportManager +import com.yizhuan.erban.avroom.activity.AVRoomActivity +import com.yizhuan.erban.base.BaseViewBindingFragment +import com.yizhuan.erban.common.EmptyViewHelper +import com.yizhuan.erban.databinding.FragmentRecommendBinding +import com.yizhuan.erban.home.HomeViewModel +import com.yizhuan.erban.home.adapter.HomeHotAdapter +import com.yizhuan.erban.ui.utils.RVDelegate +import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo +import com.yizhuan.xchat_android_core.home.event.RefreshHomeDataEvent +import com.yizhuan.xchat_android_core.room.event.RoomShieldEvent +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +/** + * Peko首页 + */ +class HomeTabFragment : BaseViewBindingFragment() { + + private lateinit var roomHotAdapter: HomeHotAdapter + + private lateinit var rvDelegate: RVDelegate + + private val homeViewModel: HomeViewModel by viewModels() + + //是否需要刷新接口进行屏蔽房间操作 + private var isShield = false + + private var pageNum = 1 + private var tabId: Int? = null + companion object { + fun newInstance(tabId: Int): HomeTabFragment { + return HomeTabFragment().apply { + arguments = Bundle().apply { + putInt("tabId", tabId) + } + } + } + } + override fun init() { + tabId = arguments?.getInt("tabId") + initRefreshView() + initHotRoomTab() + } + + private fun initRefreshView() { + binding.refreshLayout.setOnRefreshListener { + loadData(true) + } + binding.refreshLayout.isEnableLoadmore = false + binding.refreshLayout.isEnableOverScrollBounce = false + } + + private fun initHotRoomTab() { + roomHotAdapter = HomeHotAdapter() + roomHotAdapter.onItemClickListener = + BaseQuickAdapter.OnItemClickListener { _: BaseQuickAdapter<*, *>?, _: View?, position: Int -> + val homePlayInfo: HomeRoomInfo? = roomHotAdapter.getItem(position) + if (homePlayInfo != null) { + //首页_房间派对 + ReportManager.get().reportEvent( + IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( + Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.TEN), + Pair(IReportConstants.MODULE, IReportConstants.PEKO_HOMEPAGE) + ) + ) + AVRoomActivity.start(mContext, homePlayInfo.uid) + } + } + rvDelegate = RVDelegate.Builder() + .setPageSize(20) + .setAdapter(roomHotAdapter) + .setRecyclerView(binding.mRecyclerRoom) + .setEmptyView(EmptyViewHelper.createEmptyTextViewHeight(context, "暂无熱門推薦")) + .setLayoutManager(GridLayoutManager(mContext, 2)) + .build() + + roomHotAdapter.setOnLoadMoreListener({ + loadData(false) + }, binding.mRecyclerRoom) + + homeViewModel.tabHomeLiveData.observe(this) { + binding.refreshLayout.finishRefresh() + rvDelegate.loadData(it) + } + } + + override fun onLazyLoad() { + super.onLazyLoad() + loadData(true) + } + + override fun onResume() { + super.onResume() + if (isShield) { + loadData(true) + isShield = false + } + } + + private fun loadData(isRefresh: Boolean) { + if (isRefresh) { + pageNum = 1 + } else { + pageNum++ + } + homeViewModel.getHomeTabName(tabId ?: 0, pageNum) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) { + if (isResumed) { + loadData(true) + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + EventBus.getDefault().register(this) + } + + override fun onDestroyView() { + super.onDestroyView() + EventBus.getDefault().unregister(this) + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onRoomShieldEvent(event: RoomShieldEvent?) { + isShield = true + } + +} \ No newline at end of file diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt index b14fa3656..59342e48c 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/model/HomeModel.kt @@ -98,12 +98,10 @@ object HomeModel : BaseModel() { /** * 获取首页推荐房间 */ - suspend fun getHomeTabHome(): List? = + suspend fun getHomeTabHome(tabId: Int, pageNum: Int, pageSize: Int): List? = launchRequest { api.apiHomeTabHome( - "", AuthModel.get().currentUid.toString(), - CommunityConstant.VERSION_VALID_TYPE, - AuthModel.get().ticket + tabId, pageNum, pageSize ) } @@ -178,6 +176,11 @@ object HomeModel : BaseModel() { } + suspend fun getNewHomeTag(): List? = + launchRequest { + api.getNewHomeTag() + } + suspend fun getHomeTag(): List? = launchRequest { api.getHomeTag() @@ -294,11 +297,10 @@ object HomeModel : BaseModel() { */ @GET("/home/tab/homeV2") suspend fun apiHomeTabHome( - @Query("tabId") tabId: String, - @Query("uid") uid: String, - @Query("types") types: String, - @Query("ticket") ticket: String - ): ServiceResult> + @Query("tabId") tabId: Int, + @Query("page") page: Int, + @Query("pageSize") pageSize: Int + ): ServiceResult> /** * 首页Banner @@ -380,6 +382,14 @@ object HomeModel : BaseModel() { @Query("pageSize") pageSize: Int ): ServiceResult> + /** + * 首页 Tag List + * + * @return + */ + @GET("/home/tag") + suspend fun getNewHomeTag(): ServiceResult> + /** * 首页派对 Tag List *