feat:初步完善【首页-派对】数据与UI对接

This commit is contained in:
Max
2023-12-21 20:24:05 +08:00
parent b9251a89a5
commit f9bd5b7a9f
29 changed files with 608 additions and 122 deletions

View File

@@ -2,16 +2,10 @@ package com.nnbc123.app.home.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseActivity
import com.nnbc123.app.home.fragment.PartyFragment
import com.netease.nim.uikit.StatusBarUtil
import com.nnbc123.app.base.BaseBindingActivity
import com.nnbc123.app.base.BaseViewBindingActivity
import com.nnbc123.app.databinding.ActivityMoreRoomBinding
import com.nnbc123.library.annatation.ActLayoutRes
@ActLayoutRes(R.layout.activity_more_room)
class MoreRoomActivity : BaseBindingActivity<ActivityMoreRoomBinding>() {

View File

@@ -47,8 +47,8 @@ public class HomeMagicIndicatorAdapter extends CommonNavigatorAdapter {
scaleTransitionPagerTitleView.setMinScale(minScale);
scaleTransitionPagerTitleView.setTextSize(textSize);
scaleTransitionPagerTitleView.setAutoResetPivot(true);
// int padding = UIUtil.dip2px(context, 5);
// scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
int padding = UIUtil.dip2px(context, 6);
scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
scaleTransitionPagerTitleView.setText(mTitleList.get(i));
scaleTransitionPagerTitleView.setOnClickListener(view -> {
if (mOnItemSelectListener != null) {

View File

@@ -1,6 +1,14 @@
package com.nnbc123.app.home.adapter
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.utils.loadAvatar
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.utils.subAndReplaceDot2
import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.bannerview.BaseViewHolder
@@ -8,17 +16,27 @@ import com.zhpan.bannerview.BaseViewHolder
* Created by Max on 2023/12/18 19:02
* Desc:
**/
class PartyHotMessageAdapter : BaseBannerAdapter<String>() {
class PartyHotMessageAdapter : BaseBannerAdapter<GiftServiceMsgVo>() {
override fun bindData(
holder: BaseViewHolder<String>?,
data: String,
holder: BaseViewHolder<GiftServiceMsgVo>,
item: GiftServiceMsgVo,
position: Int,
pageSize: Int
) {
holder?.setText(R.id.tv_name, data)
holder.setText(R.id.tv_nick_send, item.senderNick.subAndReplaceDot2(4))
holder.setText(R.id.tv_nick_receiver, item.receiverNick.subAndReplaceDot2(4))
holder.setText(R.id.tv_gift_name, item.giftName.subAndReplaceDot2(4))
holder.setText(R.id.tv_gift_num, "x${item.giftNum}")
holder.findViewById<ImageView>(R.id.iv_avatar_send).loadAvatar(item.senderAvatar)
holder.findViewById<ImageView>(R.id.iv_avatar_receiver).loadAvatar(item.receiverAvatar)
holder.findViewById<ImageView>(R.id.iv_gift).load(item.giftPicUrl)
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.home_party_item_hot_message
}
fun getItem(position: Int): GiftServiceMsgVo? {
return mList.getOrNull(position)
}
}

View File

@@ -1,8 +1,11 @@
package com.nnbc123.app.home.adapter
import android.widget.ImageView
import androidx.core.view.isGone
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.BaseViewHolder
import com.nnbc123.app.R
import com.nnbc123.app.ui.utils.load
import com.nnbc123.core.home.bean.HomeRoomInfo
/**
@@ -12,6 +15,27 @@ import com.nnbc123.core.home.bean.HomeRoomInfo
class PartyRoomAdapter :
BaseQuickAdapter<HomeRoomInfo, BaseViewHolder>(R.layout.home_party_room_item) {
override fun convert(helper: BaseViewHolder, item: HomeRoomInfo) {
helper.setText(R.id.tv_name, item.roomName)
helper.apply {
getView<ImageView>(R.id.iv_cover).load(item.avatar)
setText(R.id.tv_online_number, "${item.onlineNum}")
setText(R.id.tv_name, item.title)
setGone(R.id.iv_tag, !item.tagPict.isNullOrEmpty())
getView<ImageView>(R.id.iv_tag).load(item.tagPict)
setGone(R.id.iv_pk, item.isCrossPking)
setGone(R.id.iv_cover_foreground, !item.backgroundPic.isNullOrEmpty())
getView<ImageView>(R.id.iv_cover_foreground).load(item.backgroundPic, defaultRes = R.color.transparent)
}
val avatars: Array<ImageView> = arrayOf(
helper.getView(R.id.iv_avatar_0),
helper.getView(R.id.iv_avatar_1),
helper.getView(R.id.iv_avatar_2),
helper.getView(R.id.iv_avatar_3),
helper.getView(R.id.iv_avatar_4)
)
for (i in avatars.indices) {
val avatarUrl = item.micUsers?.getOrNull(i)?.avatar
avatars[i].isGone = avatarUrl.isNullOrBlank()
avatars[i].load(avatarUrl)
}
}
}

View File

@@ -12,8 +12,15 @@ import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.databinding.HomeFragmentBinding
import com.nnbc123.app.home.activity.MoreRoomActivity
import com.nnbc123.app.home.adapter.HomeMagicIndicatorAdapter
import com.nnbc123.app.home.helper.OpenRoomHelper
import com.nnbc123.app.ui.search.SearchActivity
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.app.ui.widget.magicindicator.ViewPagerHelper
import com.nnbc123.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
import com.nnbc123.core.DemoCache
import com.nnbc123.core.UriProvider
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
/**
@@ -30,14 +37,24 @@ class HomeFragment2 : BaseBindingFragment<HomeFragmentBinding>() {
private fun initEvent() {
mBinding.ivMyRoom.singleClick {
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_MY_ROOM_CLICK, "首页_我的房间")
OpenRoomHelper.openRoom(baseActivity)
}
mBinding.ivRanking.singleClick {
MoreRoomActivity.start(requireContext())
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_HOME_RANK_CLICK, "首页_榜单")
CommonWebViewActivity.start(mContext, UriProvider.getRanking())
}
mBinding.tvSearch.singleClick {
StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_SEARCH, "进入搜索页")
SearchActivity.start(activity)
//为啥触发条件这么恶心 我也不知道啊
if (DemoCache.readAnchorCardView() == 0) {
DemoCache.saveAnchorCardView(1)
}
}
}

View File

@@ -12,9 +12,9 @@ import com.nnbc123.library.annatation.ActLayoutRes
**/
@ActLayoutRes(R.layout.home_make_friends_fragment)
class MakeFriendsFragment : BaseBindingFragment<HomeMakeFriendsFragmentBinding>(){
class MakeFriendsFragment : BaseBindingFragment<HomeMakeFriendsFragmentBinding>() {
override fun initiate() {
requireActivity().supportFragmentManager
childFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, MakeFriendsListFragment())
.commitAllowingStateLoss()

View File

@@ -1,22 +1,31 @@
package com.nnbc123.app.home.fragment
import android.os.Bundle
import androidx.core.view.isVisible
import androidx.fragment.app.activityViewModels
import androidx.viewpager2.widget.ViewPager2
import com.chuhai.utils.ktx.singleClick
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.databinding.HomePartyFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.activity.MoreRoomActivity
import com.nnbc123.app.home.adapter.PartyHotMessageAdapter
import com.nnbc123.app.home.dialog.RecommendRoomDialog
import com.nnbc123.app.home.helper.BannerHelper
import com.nnbc123.app.ui.im.avtivity.NimP2PMessageActivity
import com.nnbc123.app.ui.utils.load
import com.nnbc123.app.ui.webview.CommonWebViewActivity
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.home.bean.GiftServiceMsgVo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/12/18 17:58
@@ -35,34 +44,71 @@ class PartyFragment2 : BaseBindingFragment<HomePartyFragmentBinding>() {
initResource()
initHotMessage()
initBanner()
requireActivity().supportFragmentManager
mBinding.refreshLayout.isEnableLoadmore = false
mBinding.refreshLayout.isEnableOverScrollBounce = false
mBinding.refreshLayout.setOnRefreshListener {
mBinding.refreshLayout.finishRefresh()
EventBus.getDefault().post(RefreshHomeDataEvent())
}
childFragmentManager
.beginTransaction()
.replace(R.id.fragment_container_view, PartyRoomFragment())
.replace(R.id.fragment_container_view, PartyHotRoomFragment())
.commitAllowingStateLoss()
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) {
loadData()
}
}
override fun onResume() {
super.onResume()
loadData()
}
private fun loadData() {
homeViewModel.getHomeResource()
homeViewModel.getBannerInfo()
homeViewModel.getServiceGiftRecord()
}
private fun initHotMessage() {
val adapter = PartyHotMessageAdapter()
mBinding.hotMessage.apply {
setOrientation(ViewPager2.ORIENTATION_VERTICAL)
setAdapter(PartyHotMessageAdapter())
setLifecycleRegistry(lifecycle)
}.create()
mBinding.hotMessage.refreshData(ArrayList<String>().apply {
repeat(3) {
add(it.toString())
setAdapter(adapter)
registerLifecycleObserver(lifecycle)
setUserInputEnabled(false)
setOnPageClickListener { clickedView, position ->
adapter.getItem(position)?.let {
AVRoomActivity.start(mContext, it.roomUid)
}
}
})
mBinding.hotMessage.isVisible = true
}.create()
homeViewModel.giftServiceLiveData.observe(viewLifecycleOwner) {
if (it.isSuccess && !it.data.isNullOrEmpty()) {
mBinding.hotMessage.isVisible = true
mBinding.hotMessage.refreshData(it.data)
}
}
}
private fun initResource(){
private fun initResource() {
mBinding.ivResourceMore.singleClick {
MoreRoomActivity.start(requireContext())
}
homeViewModel.homeChatPickLiveData.observe(viewLifecycleOwner) {
dialogManager.dismissDialog()
it?.let {
if (it.isNotEmpty()) {
NimP2PMessageActivity.start(context, it)
}
}
}
homeViewModel.resourceLiveData.observe(this) {
if (it.isNullOrEmpty()) {
mBinding.groupResource.isVisible = false
@@ -84,24 +130,14 @@ class PartyFragment2 : BaseBindingFragment<HomePartyFragmentBinding>() {
"资源位点击",
mapOf("user_id" to AuthModel.get().currentUid.toString())
)
when {
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)
}
}
dialogManager.showProgressDialog(mContext)
homeViewModel.getResourceJumpInfo(it[i].id)
}
}
}
homeViewModel.resourceJumpLiveData.observe(this) {
homeViewModel.resourceJumpLiveData.observe(this)
{
dialogManager.dismissDialog()
it?.let {
if (it.isPick) {
@@ -126,4 +162,14 @@ class PartyFragment2 : BaseBindingFragment<HomePartyFragmentBinding>() {
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
}

View File

@@ -0,0 +1,75 @@
package com.nnbc123.app.home.fragment
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.GridLayoutManager
import com.nnbc123.app.R
import com.nnbc123.app.avroom.activity.AVRoomActivity
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.HomePartyRoomFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.PartyRoomAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.core.home.event.RefreshHomeDataEvent
import com.nnbc123.core.statistic.StatisticManager
import com.nnbc123.core.statistic.protocol.StatisticsProtocol
import com.nnbc123.library.annatation.ActLayoutRes
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Created by Max on 2023/12/18 19:35
* Desc:
**/
@ActLayoutRes(R.layout.home_party_room_fragment)
class PartyHotRoomFragment : BaseBindingFragment<HomePartyRoomFragmentBinding>() {
private val adapter = PartyRoomAdapter()
private val homeViewModel: HomeViewModel by activityViewModels()
override fun initiate() {
val rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(adapter)
.setRecyclerView(mBinding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.setLayoutManager(GridLayoutManager(context, 2))
.build()
adapter.setOnItemClickListener { _, _, position ->
adapter.getItem(position)?.let {
AVRoomActivity.start(context, it.roomUid)
StatisticManager.Instance()
.onEvent(StatisticsProtocol.EVENT_COMMON_TAB_ROOM_SUCCESS, "派对-热门进入房间成功")
}
}
homeViewModel.hotRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
@SuppressLint("CheckResult")
fun loadData(isRefresh: Boolean) {
homeViewModel.getHotRoom(1, Int.MAX_VALUE)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onResume() {
super.onResume()
loadData(true)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onRefreshHomeDataEvent(event: RefreshHomeDataEvent?) {
if (isResumed) loadData(true)
}
}

View File

@@ -1,35 +0,0 @@
package com.nnbc123.app.home.fragment
import androidx.fragment.app.activityViewModels
import androidx.recyclerview.widget.LinearLayoutManager
import com.nnbc123.app.R
import com.nnbc123.app.base.BaseBindingFragment
import com.nnbc123.app.common.EmptyViewHelper
import com.nnbc123.app.databinding.HomePartyRoomFragmentBinding
import com.nnbc123.app.home.HomeViewModel
import com.nnbc123.app.home.adapter.PartyRoomAdapter
import com.nnbc123.app.ui.utils.RVDelegate
import com.nnbc123.core.home.bean.HomeRoomInfo
import com.nnbc123.library.annatation.ActLayoutRes
/**
* Created by Max on 2023/12/18 19:35
* Desc:
**/
@ActLayoutRes(R.layout.home_party_room_fragment)
class PartyRoomFragment : BaseBindingFragment<HomePartyRoomFragmentBinding>() {
private val adapter = PartyRoomAdapter()
private val homeViewModel: HomeViewModel by activityViewModels()
override fun initiate() {
val rvDelegate = RVDelegate.Builder<HomeRoomInfo>()
.setAdapter(adapter)
.setRecyclerView(mBinding.recyclerView)
.setEmptyView(EmptyViewHelper.createEmptyView(context, "暂无数据"))
.setLayoutManager(LinearLayoutManager(mContext))
.build()
homeViewModel.getPartyRecommendRoomList()
homeViewModel.partyRecommendRoomLiveData.observe(this) {
rvDelegate.loadData(it)
}
}
}

View File

@@ -0,0 +1,24 @@
package com.nnbc123.app.home.widget
import android.content.Context
import android.util.AttributeSet
import com.zhpan.bannerview.BannerViewPager
/**
* Created by Max on 2023/12/21 17:52
* Desc:修复BannerViewPager高度模式为MeasureSpec.UNSPECIFIED导致的未复用问题
**/
class HomeBannerViewPager<T> : BannerViewPager<T> {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val hSize = MeasureSpec.getSize(heightMeasureSpec)
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(hSize, MeasureSpec.EXACTLY))
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 650 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:angle="270"
android:endColor="#99000000"
android:startColor="#00000000"
android:type="linear" />
<corners
android:bottomLeftRadius="@dimen/dp_12"
android:bottomRightRadius="@dimen/dp_12"
android:topLeftRadius="0dp"
android:topRightRadius="0dp" />
</shape>

View File

@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:viewportWidth="12"
android:viewportHeight="12">
<path
android:pathData="M5.58,0.78C5.34,1.02 5.34,1.41 5.58,1.65L9.919,6L5.58,10.35C5.34,10.59 5.34,10.98 5.58,11.22C5.819,11.46 6.208,11.46 6.448,11.22L11.22,6.435C11.46,6.195 11.46,5.805 11.22,5.565L6.448,0.78C6.208,0.54 5.819,0.54 5.58,0.78Z"
android:strokeWidth="1"
android:fillColor="#B3B3C3"
android:fillType="evenOdd"
android:strokeColor="#00000000"/>
</vector>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>
<layout xmlns:tools="http://schemas.android.com/tools">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"

View File

@@ -4,7 +4,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="match_parent">
android:layout_height="match_parent"
android:background="#F5F5F7">
<View
android:layout_width="match_parent"
@@ -36,13 +37,12 @@
android:layout_height="@dimen/dp_26"
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/dp_8"
android:layout_weight="1"
android:background="@drawable/shape_white_16dp_round"
android:drawableStart="@drawable/home_ic_search"
android:drawablePadding="@dimen/dp_7"
android:gravity="center_vertical"
android:paddingStart="@dimen/dp_9"
android:paddingEnd="@dimen/dp_32"
android:paddingEnd="@dimen/dp_20"
android:text="搜索ID、房间"
android:textColor="#B8B7C7"
android:textSize="@dimen/dp_12" />
@@ -54,9 +54,7 @@
android:layout_gravity="center_vertical"
android:layout_marginEnd="@dimen/dp_8"
android:scaleType="fitCenter"
android:src="@drawable/home_ic_my_room"
android:visibility="gone"
tools:visibility="visible" />
android:src="@drawable/home_ic_my_room" />
<ImageView
android:id="@+id/iv_ranking"

View File

@@ -83,16 +83,16 @@
android:scaleType="centerCrop"
android:src="@drawable/default_cover"
app:layout_constraintDimensionRatio="113:48"
app:layout_constraintEnd_toStartOf="@id/iv_resource_4"
app:layout_constraintEnd_toStartOf="@id/iv_resource_more"
app:layout_constraintStart_toEndOf="@id/iv_resource_2"
app:layout_constraintTop_toTopOf="@id/iv_resource_2" />
<ImageView
android:id="@+id/iv_resource_4"
android:id="@+id/iv_resource_more"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="centerCrop"
android:src="@drawable/default_cover"
android:src="@drawable/home_ic_resource_more"
app:layout_constraintDimensionRatio="113:48"
app:layout_constraintEnd_toEndOf="@id/iv_resource_1"
app:layout_constraintStart_toEndOf="@id/iv_resource_3"
@@ -103,21 +103,24 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:constraint_referenced_ids="iv_resource_0,iv_resource_1,iv_resource_2,iv_resource_3,iv_resource_4"
app:constraint_referenced_ids="iv_resource_0,iv_resource_1,iv_resource_2,iv_resource_3,iv_resource_more"
tools:visibility="visible" />
<com.zhpan.bannerview.BannerViewPager
<com.nnbc123.app.home.widget.HomeBannerViewPager
android:id="@+id/hot_message"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_height="0dp"
android:layout_marginHorizontal="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_12"
android:background="@drawable/home_bg_message"
android:visibility="gone"
app:bvp_auto_play="true"
app:bvp_can_loop="true"
app:bvp_indicator_visibility="gone"
app:bvp_interval="3000"
app:bvp_scroll_duration="500"
app:bvp_interval="5000"
app:bvp_scroll_duration="800"
app:layout_constraintDimensionRatio="345:42"
app:layout_constraintTop_toBottomOf="@id/iv_resource_2"
tools:background="@drawable/default_banner"
tools:visibility="visible" />
<com.nnbc123.app.ui.widget.rollviewpager.RollPagerView
@@ -135,22 +138,23 @@
app:rollviewpager_hint_paddingBottom="8dp"
tools:background="@drawable/default_banner"
tools:visibility="visible" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_19"
android:layout_marginTop="@dimen/dp_12"
android:paddingBottom="@dimen/dp_4"
android:text="热门推荐"
android:textColor="#2B2D33"
android:textSize="@dimen/dp_16"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/roll_view" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.CollapsingToolbarLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_19"
android:layout_marginTop="@dimen/dp_12"
android:paddingBottom="@dimen/dp_4"
android:text="热门推荐"
android:textColor="#2B2D33"
android:textSize="@dimen/dp_16"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/roll_view" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.fragment.app.FragmentContainerView

View File

@@ -1,15 +1,119 @@
<?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="match_parent"
android:layout_height="match_parent">
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_send"
android:layout_width="@dimen/dp_22"
android:layout_height="@dimen/dp_22"
android:layout_marginStart="@dimen/dp_12"
app:cborder_color="@color/white"
app:cborder_width="2px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/default_avatar" />
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:background="@color/color_999999"
android:gravity="center"
android:textSize="20sp" />
android:id="@+id/tv_nick_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_4"
android:lines="1"
android:textColor="#2B2D33"
android:textSize="@dimen/dp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_avatar_send"
app:layout_constraintTop_toTopOf="parent"
tools:text="小半" />
<TextView
android:id="@+id/tv_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_4"
android:lines="1"
android:text="赠送"
android:textColor="#992B2D33"
android:textSize="@dimen/dp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_nick_send"
app:layout_constraintTop_toTopOf="parent" />
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_receiver"
android:layout_width="@dimen/dp_22"
android:layout_height="@dimen/dp_22"
android:layout_marginStart="@dimen/dp_4"
app:cborder_color="@color/white"
app:cborder_width="2px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_send"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/default_avatar" />
<TextView
android:id="@+id/tv_nick_receiver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_4"
android:lines="1"
android:textColor="#2B2D33"
android:textSize="@dimen/dp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/iv_avatar_receiver"
app:layout_constraintTop_toTopOf="parent"
tools:text="小半" />
<TextView
android:id="@+id/tv_gift_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_4"
android:lines="1"
android:textColor="#FF9D24"
android:textSize="@dimen/dp_12"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_nick_receiver"
app:layout_constraintTop_toTopOf="parent"
tools:text="星语心愿" />
<ImageView
android:id="@+id/iv_gift"
android:layout_width="@dimen/dp_28"
android:layout_height="@dimen/dp_28"
android:layout_marginStart="@dimen/dp_4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/tv_gift_name"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/default_cover" />
<TextView
android:id="@+id/tv_gift_num"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_6"
android:ellipsize="end"
android:lines="1"
android:textColor="#2B2D33"
android:textSize="@dimen/dp_14"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/iv_arrow"
app:layout_constraintStart_toEndOf="@id/iv_gift"
app:layout_constraintTop_toTopOf="parent"
tools:text="x11" />
<ImageView
android:id="@+id/iv_arrow"
android:layout_width="@dimen/dp_12"
android:layout_height="@dimen/dp_12"
android:layout_marginEnd="@dimen/dp_12"
android:src="@drawable/home_ic_hot_message_arrow"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -6,7 +6,7 @@
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:layout_marginHorizontal="@dimen/dp_9"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2" />

View File

@@ -1,15 +1,157 @@
<?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="match_parent"
android:layout_height="100dp">
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_4"
android:layout_marginVertical="@dimen/dp_3">
<com.nnbc123.app.common.widget.RectRoundImageView
android:id="@+id/iv_cover"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scaleType="centerCrop"
app:borderRadius="@dimen/dp_12"
app:layout_constraintDimensionRatio="168:164"
app:layout_constraintTop_toTopOf="parent"
app:type="round"
tools:src="@drawable/default_cover" />
<ImageView
android:id="@+id/iv_content_background"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/home_bg_room_item"
app:layout_constraintBottom_toBottomOf="@id/iv_cover"
app:layout_constraintDimensionRatio="168:72"
app:layout_constraintEnd_toEndOf="@id/iv_cover"
app:layout_constraintStart_toStartOf="@id/iv_cover" />
<ImageView
android:id="@+id/iv_cover_foreground"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="@id/iv_cover"
app:layout_constraintEnd_toEndOf="@id/iv_cover"
app:layout_constraintStart_toStartOf="@id/iv_cover"
app:layout_constraintTop_toTopOf="@id/iv_cover" />
<ImageView
android:id="@+id/iv_tag"
android:layout_width="wrap_content"
android:layout_height="@dimen/dp_18"
android:layout_marginStart="@dimen/dp_6"
android:layout_marginTop="@dimen/dp_6"
app:layout_constraintStart_toStartOf="@id/iv_cover"
app:layout_constraintTop_toTopOf="@id/iv_cover"
tools:src="@drawable/default_cover" />
<LinearLayout
android:id="@+id/layout_avatar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_8"
android:layout_marginBottom="@dimen/dp_8"
android:orientation="horizontal"
app:layout_constraintBottom_toBottomOf="@id/iv_cover"
app:layout_constraintStart_toStartOf="@id/iv_cover">
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_0"
android:layout_width="@dimen/dp_18"
android:layout_height="@dimen/dp_18"
android:src="@drawable/default_avatar"
android:translationZ="4px"
app:cborder_color="@color/white"
app:cborder_width="1px" />
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_1"
android:layout_width="@dimen/dp_18"
android:layout_height="@dimen/dp_18"
android:layout_marginStart="-6dp"
android:src="@drawable/default_avatar"
android:translationZ="3px"
app:cborder_color="@color/white"
app:cborder_width="1px" />
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_2"
android:layout_width="@dimen/dp_18"
android:layout_height="@dimen/dp_18"
android:layout_marginStart="-6dp"
android:src="@drawable/default_avatar"
android:translationZ="2px"
app:cborder_color="@color/white"
app:cborder_width="1px" />
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_3"
android:layout_width="@dimen/dp_18"
android:layout_height="@dimen/dp_18"
android:layout_marginStart="-6dp"
android:src="@drawable/default_avatar"
android:translationZ="1px"
app:cborder_color="@color/white"
app:cborder_width="1px" />
<com.nnbc123.app.common.widget.CircleImageView
android:id="@+id/iv_avatar_4"
android:layout_width="@dimen/dp_18"
android:layout_height="@dimen/dp_18"
android:layout_marginStart="-6dp"
android:alpha="0.5"
android:src="@drawable/default_avatar"
app:cborder_color="@color/white"
app:cborder_width="1px" />
</LinearLayout>
<TextView
android:id="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="20sp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="@dimen/dp_8"
android:layout_marginBottom="@dimen/dp_4"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="@dimen/dp_14"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@id/layout_avatar"
app:layout_constraintStart_toStartOf="@id/iv_cover"
tools:text="Name" />
<ImageView
android:id="@+id/iv_pk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/dp_4"
android:src="@drawable/home_ic_pk"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@id/tv_name"
app:layout_constraintStart_toStartOf="@id/tv_name"
tools:visibility="visible" />
<TextView
android:id="@+id/tv_online_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/dp_10"
android:layout_marginBottom="@dimen/dp_8"
android:drawableStart="@drawable/ic_home_hot_hot"
android:drawablePadding="1dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:maxLines="1"
android:textColor="@color/white"
android:textSize="@dimen/dp_11"
android:textStyle="bold"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@id/iv_cover"
app:layout_constraintEnd_toEndOf="@id/iv_cover"
app:layout_constraintHorizontal_bias="1"
app:layout_constraintStart_toEndOf="@id/layout_avatar"
tools:text="999" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -86,6 +86,6 @@
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_gift_service_arrow" />
android:src="@drawable/home_ic_hot_message_arrow" />
</LinearLayout>

View File

@@ -44,6 +44,15 @@ public class HomeRoomInfo implements MultiItemEntity, Serializable {
private boolean isChecked;
private String iconContent;
private String backgroundPic;
public String getBackgroundPic() {
return backgroundPic;
}
public void setBackgroundPic(String backgroundPic) {
this.backgroundPic = backgroundPic;
}
@Override
public int getItemType() {

View File

@@ -1,5 +1,7 @@
package com.nnbc123.core.home.model
import com.google.gson.Gson
import com.nnbc123.core.DemoCache
import com.nnbc123.core.auth.AuthModel
import com.nnbc123.core.base.BaseModel
import com.nnbc123.core.bean.response.ServiceResult
@@ -13,10 +15,16 @@ import com.nnbc123.core.room.bean.SingleRoomSortInfo
import com.nnbc123.core.room.game.GameInfo
import com.nnbc123.core.user.bean.AnchorGradeInfo
import com.nnbc123.core.user.bean.UserInfo
import com.nnbc123.core.utils.SharedPreferenceUtils
import com.nnbc123.core.utils.net.RxHelper
import com.nnbc123.core.utils.net.launchRequest
import com.nnbc123.library.net.rxnet.RxNet
import io.reactivex.Single
import io.reactivex.disposables.Disposable
import io.reactivex.disposables.Disposables
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.withContext
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Query
@@ -109,10 +117,20 @@ object HomeModel : BaseModel() {
launchRequest {
api.getPlayRoom()
}
fun getHomeResourceByLocal(): MutableList<ResourceInfo>? {
return DemoCache.readHomeResourceList()
}
suspend fun getHomeResource(): MutableList<ResourceInfo>? =
launchRequest {
api.getHomeResource()
val result = api.getHomeResource()
if (result.isSuccess) {
withContext(Dispatchers.Main) {
DemoCache.saveHomeResourceList(result.data)
}
}
result
}
suspend fun getResourceJumpInfo(id: Int): HomeRoomInfo? =

View File

@@ -7,6 +7,7 @@ import androidx.annotation.Nullable;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.nnbc123.core.home.bean.ResourceInfo;
import com.nnbc123.xchat_android_constants.XChatConstants;
import com.nnbc123.core.auth.AuthModel;
import com.nnbc123.core.auth.entity.AccountInfo;
@@ -64,6 +65,7 @@ public class DemoCache {
private static final String KEY_SHOW_RADISH_TIP = "key_show_radish_tip";
private static final String KEY_NEW_GIFT_TYPE_TIP = "key_new_gift_type_tip";
private static final String KEY_NEW_GIFT_TYPE_TIP_INDICATOR = "key_new_gift_type_tip_indicator";
private static final String KEY_HOME_RESOURCE_LIST = "key_home_resource_list";
private static StatusBarNotificationConfig notificationConfig;
@@ -385,4 +387,20 @@ public class DemoCache {
return SettingsPref.instance().getBoolean(KEY_NEW_GIFT_TYPE_TIP_INDICATOR, true);
}
public static void saveHomeResourceList(List<ResourceInfo> value) {
SharedPreferenceUtils.put(KEY_HOME_RESOURCE_LIST, new Gson().toJson(value));
}
public static List<ResourceInfo> readHomeResourceList() {
try {
String jsonString = String.valueOf(SharedPreferenceUtils.get(KEY_HOME_RESOURCE_LIST, ""));
if (TextUtils.isEmpty(jsonString)) return null;
return new Gson().fromJson(jsonString,
new TypeToken<List<ResourceInfo>>() {
}.getType());
} catch (Exception e) {
return null;
}
}
}

View File

@@ -5,8 +5,12 @@ import com.nnbc123.library.utils.SingleToastUtil
fun String?.subAndReplaceDot(maxLength: Int = 6): String {
return subAndReplaceDot2(maxLength, "...")
}
fun String?.subAndReplaceDot2(maxLength: Int = 6, suffix: String = ".."): String {
if (this == null) return ""
return if (this.length > maxLength) this.substring(0, maxLength) + "..." else this
return if (this.length > maxLength) this.substring(0, maxLength) + suffix else this
}
fun String?.sub(maxLength: Int = 6): String {

View File

@@ -134,7 +134,7 @@ dependencies {
api "jp.wasabeef:glide-transformations:${GlideTransformationsVersion}"
api 'com.github.zhpanvip:BannerViewPager:3.5.6'
api 'com.github.zhpanvip:BannerViewPager:3.5.12'
api 'com.google.android.exoplayer:exoplayer:2.18.1'