新增直播Tab顶部历史记录列表

This commit is contained in:
huangjian
2022-07-18 15:02:07 +08:00
parent b2e0cc760c
commit 1cfdd1e5a0
12 changed files with 204 additions and 32 deletions

View File

@@ -9,6 +9,7 @@ import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo
import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo
import com.yizhuan.xchat_android_core.home.bean.ResourceInfo import com.yizhuan.xchat_android_core.home.bean.ResourceInfo
import com.yizhuan.xchat_android_core.home.model.HomeModel import com.yizhuan.xchat_android_core.home.model.HomeModel
import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo
import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo
import com.yizhuan.xchat_android_core.utils.toast import com.yizhuan.xchat_android_core.utils.toast
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -54,6 +55,9 @@ class HomeViewModel : BaseViewModel() {
val singleRoomSortInfoLiveData: LiveData<ListResult<SingleRoomSortInfo>> = val singleRoomSortInfoLiveData: LiveData<ListResult<SingleRoomSortInfo>> =
_singleRoomSortInfoLiveData _singleRoomSortInfoLiveData
private val _homeLiveTopInfoLiveData = MutableLiveData<HomeLiveTopInfo>()
val homeLiveTopInfoLiveData: LiveData<HomeLiveTopInfo> = _homeLiveTopInfoLiveData
fun getBannerInfo() { fun getBannerInfo() {
safeLaunch { safeLaunch {
_bannerLiveData.value = HomeModel.getHomeBanner("9") _bannerLiveData.value = HomeModel.getHomeBanner("9")
@@ -187,4 +191,16 @@ class HomeViewModel : BaseViewModel() {
) )
} }
fun requestHomeLiveTopInfo() {
safeLaunch(
onError = {
_homeLiveTopInfoLiveData.value = null
},
block = {
_homeLiveTopInfoLiveData.value = HomeModel.requestHomeLiveTopInfo()
}
)
}
} }

View File

@@ -0,0 +1,38 @@
package com.yizhuan.erban.home.adapter
import android.widget.ImageView
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.yizhuan.erban.R
import com.yizhuan.erban.avroom.activity.AVRoomActivity
import com.yizhuan.erban.ui.utils.load
import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo
import com.yizhuan.xchat_android_core.statistic.StatisticManager
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol
class HomeLiveTopAdapter :
BaseQuickAdapter<HomeLiveTopInfo.SingleRoom, BaseViewHolder>(R.layout.item_home_live_top) {
private var onceLookStatus: Boolean = false
fun setOnceLookStatus(onceLookStatus: Boolean) {
this.onceLookStatus = onceLookStatus
}
override fun convert(helper: BaseViewHolder, item: HomeLiveTopInfo.SingleRoom) {
helper.apply {
getView<ImageView>(R.id.iv_room_image).load(item.avatar)
setText(R.id.tv_room_title, item.title)
setGone(R.id.iv_room_tag, item.isRecommend && onceLookStatus)
}
helper.itemView.setOnClickListener {
AVRoomActivity.start(mContext, item.uid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_SCFJ_ROOM_SUCCESS, "成功进入收藏的房间")
}
}
}

View File

@@ -21,15 +21,13 @@ import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indic
import java.util.List; import java.util.List;
public class PartyMagicIndicatorAdapter extends CommonNavigatorAdapter { public class PartyMagicIndicatorAdapter extends CommonNavigatorAdapter {
private final Context mContext;
private final List<? extends CharSequence> mTitleList; private final List<? extends CharSequence> mTitleList;
private int textSize = 14; private int textSize = 14;
private float minScale = 1f; private float minScale = 1f;
private OnItemSelectListener mOnItemSelectListener; private OnItemSelectListener mOnItemSelectListener;
public PartyMagicIndicatorAdapter(Context context, List<? extends CharSequence> charSequences) { public PartyMagicIndicatorAdapter(List<? extends CharSequence> charSequences) {
this.mContext = context;
this.mTitleList = charSequences; this.mTitleList = charSequences;
} }
@@ -59,9 +57,7 @@ public class PartyMagicIndicatorAdapter extends CommonNavigatorAdapter {
@Override @Override
public IPagerIndicator getIndicator(Context context) { public IPagerIndicator getIndicator(Context context) {
WrapPagerIndicator indicator = new WrapPagerIndicator(context); return new WrapPagerIndicator(context);
indicator.setFillColor(Color.parseColor("#FFFFCB47"));
return indicator;
} }
public int getTextSize() { public int getTextSize() {

View File

@@ -10,6 +10,7 @@ import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.coorchice.library.utils.LogUtils import com.coorchice.library.utils.LogUtils
import com.scwang.smartrefresh.layout.internal.ProgressDrawable import com.scwang.smartrefresh.layout.internal.ProgressDrawable
import com.yizhuan.erban.R import com.yizhuan.erban.R
@@ -17,25 +18,28 @@ import com.yizhuan.erban.avroom.activity.AVRoomActivity
import com.yizhuan.erban.avroom.adapter.RoomVPAdapter import com.yizhuan.erban.avroom.adapter.RoomVPAdapter
import com.yizhuan.erban.base.BaseFragment import com.yizhuan.erban.base.BaseFragment
import com.yizhuan.erban.base.BaseViewBindingFragment import com.yizhuan.erban.base.BaseViewBindingFragment
import com.yizhuan.erban.common.EmptyViewHelper
import com.yizhuan.erban.databinding.FragmentLiveBinding import com.yizhuan.erban.databinding.FragmentLiveBinding
import com.yizhuan.erban.databinding.FragmentRecommendBinding import com.yizhuan.erban.databinding.FragmentRecommendBinding
import com.yizhuan.erban.home.HomeViewModel import com.yizhuan.erban.home.HomeViewModel
import com.yizhuan.erban.home.adapter.HomeSingleAnchorAdapter import com.yizhuan.erban.home.adapter.*
import com.yizhuan.erban.home.adapter.MainMagicIndicatorAdapter
import com.yizhuan.erban.home.adapter.PartyMagicIndicatorAdapter
import com.yizhuan.erban.home.dialog.RecommendRoomDialog import com.yizhuan.erban.home.dialog.RecommendRoomDialog
import com.yizhuan.erban.home.helper.BannerHelper import com.yizhuan.erban.home.helper.BannerHelper
import com.yizhuan.erban.ui.utils.RVDelegate
import com.yizhuan.erban.ui.utils.load import com.yizhuan.erban.ui.utils.load
import com.yizhuan.erban.ui.webview.CommonWebViewActivity import com.yizhuan.erban.ui.webview.CommonWebViewActivity
import com.yizhuan.erban.ui.widget.magicindicator.ViewPagerHelper import com.yizhuan.erban.ui.widget.magicindicator.ViewPagerHelper
import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.yizhuan.xchat_android_core.auth.AuthModel import com.yizhuan.xchat_android_core.auth.AuthModel
import com.yizhuan.xchat_android_core.home.bean.HomeRoomInfo
import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo
import com.yizhuan.xchat_android_core.home.event.RefreshHomeDataEvent import com.yizhuan.xchat_android_core.home.event.RefreshHomeDataEvent
import com.yizhuan.xchat_android_core.initial.InitialModel import com.yizhuan.xchat_android_core.initial.InitialModel
import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo
import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo
import com.yizhuan.xchat_android_core.statistic.StatisticManager import com.yizhuan.xchat_android_core.statistic.StatisticManager
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol
import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils
import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode import org.greenrobot.eventbus.ThreadMode
@@ -50,7 +54,10 @@ class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
private val mFragments: ArrayList<Fragment> = ArrayList() private val mFragments: ArrayList<Fragment> = ArrayList()
private val mTabInfoList: ArrayList<CharSequence> = ArrayList() private val mTabInfoList: ArrayList<CharSequence> = ArrayList()
private var currentIndex = 0 private var currentIndex = 0
private var lastLoadDataTime = 0L
private lateinit var mAdapter: HomeLiveTopAdapter
private lateinit var rvDelegate: RVDelegate<HomeLiveTopInfo.SingleRoom>
private val homeViewModel: HomeViewModel by activityViewModels() private val homeViewModel: HomeViewModel by activityViewModels()
companion object { companion object {
@@ -62,8 +69,13 @@ class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
} }
} }
override fun init() { override fun init() {
mAdapter = HomeLiveTopAdapter()
rvDelegate = RVDelegate.Builder<HomeLiveTopInfo.SingleRoom>()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false))
.setRecyclerView(binding.recyclerView)
.build()
initRefreshView() initRefreshView()
homeViewModel.singleRoomSortInfoLiveData.observe( homeViewModel.singleRoomSortInfoLiveData.observe(
viewLifecycleOwner viewLifecycleOwner
@@ -72,6 +84,14 @@ class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
it.data?.let { date -> onGetSingleRoomSortInfoSuccess(date) } it.data?.let { date -> onGetSingleRoomSortInfoSuccess(date) }
} }
} }
homeViewModel.homeLiveTopInfoLiveData.observe(viewLifecycleOwner) {
it?.let {
mAdapter.setOnceLookStatus(it.onceLookStatus)
rvDelegate.loadData(it.singleRoomList, true)
binding.tvTitle.text = if (it.onceLookStatus) "曾经看过的人" else "Top热播"
}
}
} }
override fun onResume() { override fun onResume() {
@@ -79,7 +99,6 @@ class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
loadData() loadData()
} }
private fun onGetSingleRoomSortInfoSuccess(info: List<SingleRoomSortInfo>) { private fun onGetSingleRoomSortInfoSuccess(info: List<SingleRoomSortInfo>) {
var changed = false var changed = false
val oldTabInfoList: List<CharSequence> = ArrayList<CharSequence>(mTabInfoList) val oldTabInfoList: List<CharSequence> = ArrayList<CharSequence>(mTabInfoList)
@@ -93,15 +112,15 @@ class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
if (changed) { if (changed) {
mTabInfoList.clear() mTabInfoList.clear()
mFragments.clear() mFragments.clear()
for (i in info.indices) { for (tagInfo in info) {
mTabInfoList.add(info[i].sortName) mTabInfoList.add(tagInfo.sortName)
val fragment = RoomSingleFragment.newInstance(info[i].id) val fragment = RoomSingleFragment.newInstance(tagInfo.id)
mFragments.add(fragment) mFragments.add(fragment)
} }
val commonNavigator = CommonNavigator(context) val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true) commonNavigator.setTitleWrapContent(true)
commonNavigator.titleMargin = 8 commonNavigator.titleMargin = 8
val magicIndicatorAdapter = PartyMagicIndicatorAdapter(context, mTabInfoList) val magicIndicatorAdapter = PartyMagicIndicatorAdapter(mTabInfoList)
magicIndicatorAdapter.textSize = 12 magicIndicatorAdapter.textSize = 12
magicIndicatorAdapter.setOnItemSelectListener(this) magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter commonNavigator.adapter = magicIndicatorAdapter
@@ -145,7 +164,10 @@ class LiveFragment : BaseViewBindingFragment<FragmentLiveBinding>(),
} }
private fun loadData() { private fun loadData() {
if (CurrentTimeUtils.getCurrentTime() - lastLoadDataTime < 15 * 1000) return
lastLoadDataTime = CurrentTimeUtils.getCurrentTime()
homeViewModel.requestSingleRoomSortList() homeViewModel.requestSingleRoomSortList()
homeViewModel.requestHomeLiveTopInfo()
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {

View File

@@ -111,7 +111,7 @@ class PartyFragment : BaseFragment(), PartyMagicIndicatorAdapter.OnItemSelectLis
val commonNavigator = CommonNavigator(context) val commonNavigator = CommonNavigator(context)
commonNavigator.setTitleWrapContent(true) commonNavigator.setTitleWrapContent(true)
commonNavigator.titleMargin = 8 commonNavigator.titleMargin = 8
val magicIndicatorAdapter = PartyMagicIndicatorAdapter(context, mTabInfoList) val magicIndicatorAdapter = PartyMagicIndicatorAdapter(mTabInfoList)
magicIndicatorAdapter.textSize = 14 magicIndicatorAdapter.textSize = 14
magicIndicatorAdapter.setOnItemSelectListener(this) magicIndicatorAdapter.setOnItemSelectListener(this)
commonNavigator.adapter = magicIndicatorAdapter commonNavigator.adapter = magicIndicatorAdapter

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -30,33 +30,58 @@
app:contentScrim="@color/transparent" app:contentScrim="@color/transparent"
app:layout_scrollFlags="scroll|enterAlwaysCollapsed"> app:layout_scrollFlags="scroll|enterAlwaysCollapsed">
<LinearLayout <androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:layout_marginStart="15dp"
android:layout_marginEnd="15dp"
android:orientation="vertical"
android:paddingTop="15dp"
android:paddingBottom="15dp">
<View
android:id="@+id/view_bg"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@drawable/home_live_bg_top_history"
app:layout_constraintDimensionRatio="690:254"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="6dp"
android:drawableStart="@drawable/home_live_ic_top_like"
android:drawablePadding="4dp"
android:gravity="center"
android:includeFontPadding="false"
android:text="曾经看过的人" android:text="曾经看过的人"
android:textColor="#ff333333" android:textColor="@color/color_333333"
android:textSize="14sp" /> android:textSize="14sp"
app:layout_constraintStart_toStartOf="@id/view_bg"
app:layout_constraintTop_toTopOf="@id/view_bg" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_single_anchor" android:id="@+id/recycler_view"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="0dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="12dp"
android:clipToPadding="false"
android:overScrollMode="never" android:overScrollMode="never"
android:paddingStart="5dp" android:paddingStart="7dp"
android:paddingTop="@dimen/dp_10" android:paddingEnd="7dp"
android:paddingEnd="5dp"
android:paddingBottom="@dimen/dp_10"
android:scrollbars="none" android:scrollbars="none"
android:visibility="gone" app:layout_constraintBottom_toBottomOf="@id/view_bg"
tools:visibility="visible" /> app:layout_constraintEnd_toEndOf="@id/view_bg"
app:layout_constraintStart_toStartOf="@id/view_bg"
app:layout_constraintTop_toBottomOf="@id/tv_title" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
</com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.CollapsingToolbarLayout>
@@ -77,7 +102,6 @@
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager <androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager" android:id="@+id/view_pager"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@@ -0,0 +1,50 @@
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="6dp"
android:layout_marginEnd="6dp">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@+id/iv_room_image"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_marginStart="2dp"
android:layout_marginTop="1dp"
android:src="@drawable/default_cover"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_corner_radius="8dp" />
<TextView
android:id="@+id/iv_room_tag"
android:layout_width="26dp"
android:layout_height="13dp"
android:background="@drawable/home_live_bg_recommend"
android:gravity="center_horizontal"
android:text="推荐"
android:textColor="@color/white"
android:textSize="8sp"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_room_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/color_333333"
android:textSize="10sp"
app:layout_constraintEnd_toEndOf="@id/iv_room_image"
app:layout_constraintStart_toStartOf="@id/iv_room_image"
app:layout_constraintTop_toBottomOf="@id/iv_room_image"
tools:text="余生点唱歌曲交友房间" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -6,6 +6,7 @@ import com.yizhuan.xchat_android_core.bean.response.ServiceResult
import com.yizhuan.xchat_android_core.community.CommunityConstant import com.yizhuan.xchat_android_core.community.CommunityConstant
import com.yizhuan.xchat_android_core.community.bean.UnReadCountInfo import com.yizhuan.xchat_android_core.community.bean.UnReadCountInfo
import com.yizhuan.xchat_android_core.home.bean.* import com.yizhuan.xchat_android_core.home.bean.*
import com.yizhuan.xchat_android_core.room.bean.HomeLiveTopInfo
import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo import com.yizhuan.xchat_android_core.room.bean.SingleRoomSortInfo
import com.yizhuan.xchat_android_core.user.bean.UserInfo import com.yizhuan.xchat_android_core.user.bean.UserInfo
import com.yizhuan.xchat_android_core.utils.net.RxHelper import com.yizhuan.xchat_android_core.utils.net.RxHelper
@@ -156,6 +157,12 @@ object HomeModel : BaseModel() {
api.requestSingleRoomSortList() api.requestSingleRoomSortList()
} }
suspend fun requestHomeLiveTopInfo(): HomeLiveTopInfo? =
launchRequest {
api.requestHomeLiveTopInfo()
}
private interface Api { private interface Api {
/** /**
* 提交反馈 * 提交反馈
@@ -326,6 +333,12 @@ object HomeModel : BaseModel() {
@GET("single/broadcast/sort") @GET("single/broadcast/sort")
suspend fun requestSingleRoomSortList(): ServiceResult<List<SingleRoomSortInfo>> suspend fun requestSingleRoomSortList(): ServiceResult<List<SingleRoomSortInfo>>
/**
* @return
*/
@GET("single/broadcast/onceLook")
suspend fun requestHomeLiveTopInfo(): ServiceResult<HomeLiveTopInfo>
} }
} }

View File

@@ -0,0 +1,13 @@
package com.yizhuan.xchat_android_core.room.bean
data class HomeLiveTopInfo(
val onceLookStatus: Boolean = false,
val singleRoomList: List<SingleRoom> = listOf()
) {
data class SingleRoom(
val avatar: String = "",
val isRecommend: Boolean = false,
val title: String = "",
val uid: Long = 0
)
}