feat:完成首页动态Tab功能
This commit is contained in:
@@ -14,8 +14,8 @@ import kotlinx.coroutines.async
|
||||
|
||||
class HomeViewModel : BaseViewModel() {
|
||||
|
||||
private val _tabHomeLiveData = MutableLiveData<List<HomeTabMapInfo>?>()
|
||||
val tabHomeLiveData: MutableLiveData<List<HomeTabMapInfo>?> = _tabHomeLiveData
|
||||
private val _tabHomeLiveData = MutableLiveData<ListResult<HomeRoomInfo>?>()
|
||||
val tabHomeLiveData: MutableLiveData<ListResult<HomeRoomInfo>?> = _tabHomeLiveData
|
||||
|
||||
private val _bannerLiveData = MutableLiveData<List<BannerInfo>?>()
|
||||
val bannerLiveData: MutableLiveData<List<BannerInfo>?> = _bannerLiveData
|
||||
@@ -47,6 +47,8 @@ class HomeViewModel : BaseViewModel() {
|
||||
private val _tagLiveData = MutableLiveData<List<HomeTagInfo>>()
|
||||
val tagLiveData: LiveData<List<HomeTagInfo>> = _tagLiveData
|
||||
|
||||
val homeTagLiveData: MutableLiveData<List<HomeTagInfo>> = MutableLiveData<List<HomeTagInfo>>()
|
||||
|
||||
private val _emptyLiveData = MutableLiveData<Boolean>()
|
||||
val emptyLiveData: LiveData<Boolean> = _emptyLiveData
|
||||
|
||||
@@ -62,13 +64,14 @@ class HomeViewModel : BaseViewModel() {
|
||||
private val _newFriendLiveData = MutableLiveData<ListResult<UserInfo>>()
|
||||
val newFriendLiveData: LiveData<ListResult<UserInfo>> = _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()
|
||||
|
@@ -87,10 +87,6 @@ class RoomNewFriendsAdapter :
|
||||
}
|
||||
}
|
||||
|
||||
helper.getView<View>(R.id.iv_avatar).setOnClickListener {
|
||||
UserInfoActivity.Companion.start(mContext, item.uid)
|
||||
}
|
||||
|
||||
val tvNickname = helper.getView<TextView>(R.id.tv_nickname)
|
||||
tvNickname.text = item.nick
|
||||
|
||||
|
@@ -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<FragmentAccompanyBinding>() {
|
||||
|
||||
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<UserInfo>()
|
||||
.setAdapter(roomNewFriendsAdapter)
|
||||
.setRecyclerView(binding.recyclerView)
|
||||
|
@@ -40,20 +40,18 @@ import com.zhpan.bannerview.BannerViewPager
|
||||
class HomeFragment : BaseViewBindingFragment<FragmentHomeBinding>(), View.OnClickListener,
|
||||
MainIndicatorAdapter.OnItemSelectListener {
|
||||
|
||||
private val mFragments = mutableListOf<Class<out Fragment>>()
|
||||
private val mTabInfoList = mutableListOf<HomeTagInfo>()
|
||||
private val tabList = mutableListOf<HomeTagInfo>()
|
||||
private val tabTitleList = mutableListOf<String>()
|
||||
private val homeViewModel: HomeViewModel by activityViewModels()
|
||||
|
||||
private var mBanner: BannerViewPager<BannerInfo>? = 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<FragmentHomeBinding>(), 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<FragmentHomeBinding>(), 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<FragmentHomeBinding>(), 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<FragmentHomeBinding>(), View.OnClic
|
||||
}
|
||||
}
|
||||
}
|
||||
homeViewModel.getHomeTagInfo()
|
||||
homeViewModel.getBannerInfo()
|
||||
homeViewModel.getCurrentResourceInfo()
|
||||
}
|
||||
@@ -157,6 +161,7 @@ class HomeFragment : BaseViewBindingFragment<FragmentHomeBinding>(), View.OnClic
|
||||
DemoCache.saveAnchorCardView(1)
|
||||
}
|
||||
}
|
||||
|
||||
R.id.iv_ranking -> {
|
||||
//首页_排行榜
|
||||
ReportManager.get().reportEvent(
|
||||
@@ -167,6 +172,7 @@ class HomeFragment : BaseViewBindingFragment<FragmentHomeBinding>(), View.OnClic
|
||||
)
|
||||
CommonWebViewActivity.start(mContext, UriProvider.getRanking())
|
||||
}
|
||||
|
||||
R.id.iv_my_room -> {
|
||||
//首页_创建房间
|
||||
ReportManager.get().reportEvent(
|
||||
@@ -180,63 +186,100 @@ class HomeFragment : BaseViewBindingFragment<FragmentHomeBinding>(), 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<String, Any>(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<HomeTagInfo>): List<HomeTagInfo> {
|
||||
val finalList = ArrayList<HomeTagInfo>()
|
||||
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<HomeTagInfo>) {
|
||||
// 预防脏数据导致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()
|
||||
}
|
||||
}
|
@@ -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<FragmentRecommendBinding>() {
|
||||
|
||||
private lateinit var roomHotAdapter: HomeHotAdapter
|
||||
|
||||
private lateinit var rvDelegate: RVDelegate<HomeRoomInfo>
|
||||
|
||||
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<HomeRoomInfo>()
|
||||
.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
|
||||
}
|
||||
|
||||
}
|
@@ -98,12 +98,10 @@ object HomeModel : BaseModel() {
|
||||
/**
|
||||
* 获取首页推荐房间
|
||||
*/
|
||||
suspend fun getHomeTabHome(): List<HomeTabMapInfo>? =
|
||||
suspend fun getHomeTabHome(tabId: Int, pageNum: Int, pageSize: Int): List<HomeRoomInfo>? =
|
||||
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<HomeTagInfo>? =
|
||||
launchRequest {
|
||||
api.getNewHomeTag()
|
||||
}
|
||||
|
||||
suspend fun getHomeTag(): List<HomeTagInfo>? =
|
||||
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<List<HomeTabMapInfo>>
|
||||
@Query("tabId") tabId: Int,
|
||||
@Query("page") page: Int,
|
||||
@Query("pageSize") pageSize: Int
|
||||
): ServiceResult<List<HomeRoomInfo>>
|
||||
|
||||
/**
|
||||
* 首页Banner
|
||||
@@ -380,6 +382,14 @@ object HomeModel : BaseModel() {
|
||||
@Query("pageSize") pageSize: Int
|
||||
): ServiceResult<List<HomeRoomInfo>>
|
||||
|
||||
/**
|
||||
* 首页 Tag List
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@GET("/home/tag")
|
||||
suspend fun getNewHomeTag(): ServiceResult<List<HomeTagInfo>>
|
||||
|
||||
/**
|
||||
* 首页派对 Tag List
|
||||
*
|
||||
|
Reference in New Issue
Block a user