From b9f87b4984f751a7a17112af46d168004819c39f Mon Sep 17 00:00:00 2001 From: max Date: Fri, 14 Jun 2024 18:43:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=94=B9=E7=89=88UI=E9=83=A8=E5=88=86?= =?UTF-8?q?=EF=BC=88=E9=A6=96=E9=A1=B5-=E6=8E=A8=E8=8D=90=E3=80=81?= =?UTF-8?q?=E9=A6=96=E9=A1=B5-=E6=88=91=E7=9A=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../home/adapter/HomeIndicatorAdapter.java | 103 +++++++ .../chwl/app/home/fragment/HomeFragment.kt | 225 ++------------- .../home/fragment/HomeRecommendFragment.kt | 258 ++++++++++++++++++ .../app/home/fragment/HomeWithMeFragment.kt | 143 ++++++++++ ...ava => HomeRecommendIndicatorAdapter.java} | 13 +- .../chwl/app/vip/dialog/VipUpgradeDialog.kt | 3 +- .../res/drawable-xxhdpi/home_ic_search.png | Bin 0 -> 2059 bytes app/src/main/res/drawable/home_ic_search.xml | 12 - .../res/drawable/home_me_room_card_bg.xml | 7 + .../drawable/home_recommend_tab_splitter.xml | 6 + app/src/main/res/layout/fragment_home.xml | 163 ++--------- .../res/layout/fragment_home_recommend.xml | 117 ++++++++ app/src/main/res/layout/home_me_fragment.xml | 205 ++++++++++++++ app/src/main/res/values-ar/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 5 +- app/src/main/res/values/strings.xml | 2 + 16 files changed, 894 insertions(+), 370 deletions(-) create mode 100644 app/src/main/java/com/chwl/app/home/adapter/HomeIndicatorAdapter.java create mode 100644 app/src/main/java/com/chwl/app/home/fragment/HomeRecommendFragment.kt create mode 100644 app/src/main/java/com/chwl/app/home/fragment/HomeWithMeFragment.kt rename app/src/main/java/com/chwl/app/ui/user/adapter/{MainIndicatorAdapter.java => HomeRecommendIndicatorAdapter.java} (88%) create mode 100644 app/src/main/res/drawable-xxhdpi/home_ic_search.png delete mode 100644 app/src/main/res/drawable/home_ic_search.xml create mode 100644 app/src/main/res/drawable/home_me_room_card_bg.xml create mode 100644 app/src/main/res/drawable/home_recommend_tab_splitter.xml create mode 100644 app/src/main/res/layout/fragment_home_recommend.xml create mode 100644 app/src/main/res/layout/home_me_fragment.xml diff --git a/app/src/main/java/com/chwl/app/home/adapter/HomeIndicatorAdapter.java b/app/src/main/java/com/chwl/app/home/adapter/HomeIndicatorAdapter.java new file mode 100644 index 000000000..ac4ec16e8 --- /dev/null +++ b/app/src/main/java/com/chwl/app/home/adapter/HomeIndicatorAdapter.java @@ -0,0 +1,103 @@ +package com.chwl.app.home.adapter; + +import android.content.Context; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; + +import com.chwl.app.R; +import com.chwl.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView; +import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter; +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView; +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator; + +import java.util.List; + +public class HomeIndicatorAdapter extends CommonNavigatorAdapter { + private final Context mContext; + private final List mTitleList; + + private int textSize = 21; + private float minScale = 0.857f; + private boolean showIndicator = true; + private OnItemSelectListener mOnItemSelectListener; + + public HomeIndicatorAdapter(Context context, List charSequences) { + this.mContext = context; + this.mTitleList = charSequences; + } + + @Override + public int getCount() { + return mTitleList == null ? 0 : mTitleList.size(); + } + + @Override + public IPagerTitleView getTitleView(Context context, final int i) { + ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true); + scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.white_transparent_60)); + scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.color_FFFFFF)); + scaleTransitionPagerTitleView.setMinScale(minScale); + scaleTransitionPagerTitleView.setTextSize(textSize); + int padding = UIUtil.dip2px(context, 13); + scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0); + scaleTransitionPagerTitleView.setText(mTitleList.get(i)); + scaleTransitionPagerTitleView.setOnClickListener(view -> { + if (mOnItemSelectListener != null) { + mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView); + } + + }); + return scaleTransitionPagerTitleView; + } + + @Override + public IPagerIndicator getIndicator(Context context) { + LinePagerIndicator indicator = new LinePagerIndicator(context); + indicator.setMode(LinePagerIndicator.MODE_EXACTLY); + indicator.setLineHeight(UIUtil.dip2px(mContext, 1.5)); + indicator.setRoundRadius(UIUtil.dip2px(mContext, 1)); + indicator.setLineWidth(UIUtil.dip2px(mContext, 8)); + indicator.setColors(context.getResources().getColor(R.color.color_10ECD6)); + FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); +// lp.bottomMargin = mBottomMargin; + indicator.setLayoutParams(lp); + return indicator; + } + + public int getTextSize() { + return textSize; + } + + public void setTextSize(int textSize) { + this.textSize = textSize; + } + + public float getMinScale() { + return minScale; + } + + public void setMinScale(float minScale) { + this.minScale = minScale; + } + + public boolean isShowIndicator() { + return showIndicator; + } + + public void setShowIndicator(boolean showIndicator) { + this.showIndicator = showIndicator; + } + + public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) { + mOnItemSelectListener = onItemSelectListener; + } + + public interface OnItemSelectListener { + void onItemSelect(int position, TextView view); + } +} diff --git a/app/src/main/java/com/chwl/app/home/fragment/HomeFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/HomeFragment.kt index a689fe6a0..425c2a5ff 100644 --- a/app/src/main/java/com/chwl/app/home/fragment/HomeFragment.kt +++ b/app/src/main/java/com/chwl/app/home/fragment/HomeFragment.kt @@ -1,148 +1,37 @@ package com.chwl.app.home.fragment -import android.view.Gravity import android.view.View -import androidx.core.view.isVisible import android.widget.TextView import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels -import androidx.viewpager2.adapter.FragmentStateAdapter import com.chwl.app.R import com.chwl.app.application.IReportConstants import com.chwl.app.application.ReportManager -import com.chwl.app.avroom.activity.AVRoomActivity +import com.chwl.app.avroom.adapter.CommonVPAdapter +import com.chwl.app.avroom.adapter.RoomMessageIndicatorAdapter import com.chwl.app.base.BaseViewBindingFragment import com.chwl.app.databinding.FragmentHomeBinding import com.chwl.app.home.HomeViewModel -import com.chwl.app.home.adapter.HomeBannerAdapter -import com.chwl.app.home.dialog.RecommendRoomDialog -import com.chwl.app.home.helper.OpenRoomHelper +import com.chwl.app.home.adapter.HomeIndicatorAdapter import com.chwl.app.ui.search.SearchActivity -import com.chwl.app.ui.utils.load -import com.chwl.app.ui.user.adapter.MainIndicatorAdapter -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.UriProvider -import com.chwl.core.home.bean.BannerInfo -import com.chwl.core.home.bean.HomeTagInfo -import com.chwl.core.home.event.RefreshHomeDataEvent -import com.chwl.library.utils.ListUtils -import com.netease.nim.uikit.common.util.sys.ScreenUtil -import com.zhpan.bannerview.BannerViewPager -import org.greenrobot.eventbus.EventBus /** 首页 */ -class HomeFragment : BaseViewBindingFragment(), View.OnClickListener, - MainIndicatorAdapter.OnItemSelectListener { +class HomeFragment : BaseViewBindingFragment(), View.OnClickListener { - private val TAB_ID_RECOMMEND = Int.MAX_VALUE - 1 - - private val TAB_ID_ACCOMPANY = Int.MAX_VALUE - 2 - - private val tabList = mutableListOf() - private val tabTitleList = mutableListOf() private val homeViewModel: HomeViewModel by activityViewModels() override fun init() { initListener() initTab() - initBanner() - initResource() - homeViewModel.homeTagLiveData.observe(this) { - loadTabList(transformTabList(it)) - } - homeViewModel.getHomeTagInfo() } private fun initListener() { binding.tvSearch.setOnClickListener(this) - binding.ivRanking.setOnClickListener(this) - binding.ivMyRoom.setOnClickListener(this) - binding.refreshLayout.setOnRefreshListener { - it.finishRefresh() - EventBus.getDefault().post(RefreshHomeDataEvent()) - homeViewModel.getBannerInfo() - if (binding.viewPager.adapter?.itemCount == 0) { - homeViewModel.getHomeTagInfo() - } - } - binding.refreshLayout.isEnableLoadmore = false - binding.refreshLayout.isEnableOverScrollBounce = false - } - - private fun initResource(){ - homeViewModel.currentResourceLiveData.observe(this) { - it?.let { - val resourceViews = arrayOf( - binding.ivResource0, - binding.ivResource1 - ) - if (it.size != 2) { - resourceViews.forEach { - it.isVisible = false - } - return@observe - } - resourceViews.forEach { - it.isVisible = true - } - for (i in resourceViews.indices) { - resourceViews[i].load(it[i].icon) - resourceViews[i].setOnClickListener { _ -> - when { - it[i].resourceType == 5 -> { - CommonWebViewActivity.start(context, it[i].resourceContent) - } - else -> { - dialogManager.showProgressDialog(mContext) - homeViewModel.getResourceJumpInfo(it[i].id) - } - } - } - } - } - } - homeViewModel.resourceJumpLiveData.observe(this) { - dialogManager.dismissDialog() - it?.let { - if (it.isPick) { - AVRoomActivity.start(context, it.uid) - } else { - RecommendRoomDialog.newInstance(it).show(context) - } - } - } - homeViewModel.getCurrentResourceInfo() - } - - private fun initBanner() { - val bannerView: BannerViewPager = - binding.bannerView as BannerViewPager - homeViewModel.bannerLiveData.observe(this) { - it?.let { - if (ListUtils.isListEmpty(it)) { - bannerView.visibility = View.GONE - return@let - } - bannerView.visibility = View.VISIBLE - bannerView.adapter = HomeBannerAdapter() - bannerView.post { - binding.bannerView.setPageMargin(UIUtil.dip2px(mContext, 8.0)) - .setScrollDuration(800) - .setOnPageClickListener { _: View?, position: Int -> - CommonJumpHelper.bannerJump(context, it[position]) - } - .create(it) - } - } - } - homeViewModel.getBannerInfo() } override fun onClick(v: View) { @@ -161,107 +50,35 @@ class HomeFragment : BaseViewBindingFragment(), View.OnClic DemoCache.saveAnchorCardView(1) } } - - R.id.iv_ranking -> { - //首页_排行榜 - CommonWebViewActivity.start(mContext, UriProvider.getRanking()) - } - - R.id.iv_my_room -> { - OpenRoomHelper.openRoom(baseActivity) - } } } private fun initTab() { + val fragmentList = ArrayList() + fragmentList.add(HomeRecommendFragment()) + fragmentList.add(HomeWithMeFragment()) + val titleList = ArrayList() + titleList.add(getString(R.string.main_tab_recommend)) + titleList.add(getString(R.string.main_me)) 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) + val magicIndicatorAdapter = HomeIndicatorAdapter(context, titleList) + magicIndicatorAdapter.setOnItemSelectListener { position: Int, view: TextView? -> + binding.viewPager.currentItem = position + } 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) { - TAB_ID_RECOMMEND.toLong() -> { - RecommendFragment() - } - - TAB_ID_ACCOMPANY.toLong() -> { - AccompanyFragment() - } - - else -> { - return HomeTabFragment.newInstance(itemId.toInt()) - } - } - } - - override fun getItemCount(): Int { - return tabList.size - } - } + binding.viewPager.offscreenPageLimit = 2 + binding.viewPager.adapter = CommonVPAdapter( + childFragmentManager, + lifecycle, + fragmentList + ) ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager) - loadTabList(transformTabList(emptyList())) - } - - private fun transformTabList(list: List): List { -// val finalList = ArrayList() -// finalList.add( -// HomeTagInfo( -// TAB_ID_RECOMMEND, -// ResUtil.getString(R.string.home_fragment_homefragment_04), -// 0 -// ) -// ) -// finalList.addAll(list) -// finalList.add( -// HomeTagInfo( -// TAB_ID_ACCOMPANY, -// ResUtil.getString(R.string.home_fragment_homefragment_07), -// 0 -// ) -// ) - return list - } - - 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() + binding.viewPager.isUserInputEnabled = false } override fun onDestroyView() { super.onDestroyView() - tabList.clear() - tabTitleList.clear() - } - - override fun onItemSelect(position: Int, view: TextView?) { - binding.viewPager.currentItem = position } } \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/home/fragment/HomeRecommendFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/HomeRecommendFragment.kt new file mode 100644 index 000000000..840253cfe --- /dev/null +++ b/app/src/main/java/com/chwl/app/home/fragment/HomeRecommendFragment.kt @@ -0,0 +1,258 @@ +package com.chwl.app.home.fragment + +import android.view.View +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.view.isVisible +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.chwl.app.R +import com.chwl.app.application.IReportConstants +import com.chwl.app.application.ReportManager +import com.chwl.app.avroom.activity.AVRoomActivity +import com.chwl.app.base.BaseViewBindingFragment +import com.chwl.app.databinding.FragmentHomeRecommendBinding +import com.chwl.app.home.HomeViewModel +import com.chwl.app.home.adapter.HomeBannerAdapter +import com.chwl.app.home.dialog.RecommendRoomDialog +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.core.home.event.RefreshHomeDataEvent +import com.chwl.library.utils.ListUtils +import com.example.lib_utils.ktx.getDrawableById +import com.zhpan.bannerview.BannerViewPager +import org.greenrobot.eventbus.EventBus + +/** +首页 + */ +class HomeRecommendFragment : BaseViewBindingFragment(), + View.OnClickListener, + HomeRecommendIndicatorAdapter.OnItemSelectListener { + + private val TAB_ID_RECOMMEND = Int.MAX_VALUE - 1 + + private val TAB_ID_ACCOMPANY = Int.MAX_VALUE - 2 + + private val tabList = mutableListOf() + private val homeViewModel: HomeViewModel by activityViewModels() + + override fun init() { + initListener() + initTab() + initBanner() + initResource() + homeViewModel.homeTagLiveData.observe(this) { + loadTabList(transformTabList(it)) + } + homeViewModel.getHomeTagInfo() + } + + private fun initListener() { +// binding.tvSearch.setOnClickListener(this) +// binding.ivRanking.setOnClickListener(this) +// binding.ivMyRoom.setOnClickListener(this) + binding.refreshLayout.setOnRefreshListener { + it.finishRefresh() + EventBus.getDefault().post(RefreshHomeDataEvent()) + homeViewModel.getBannerInfo() + if (binding.viewPager.adapter?.itemCount == 0) { + homeViewModel.getHomeTagInfo() + } + } + binding.refreshLayout.isEnableLoadmore = false + binding.refreshLayout.isEnableOverScrollBounce = false + } + + private fun initResource() { + homeViewModel.currentResourceLiveData.observe(this) { + it?.let { + val resourceViews = arrayOf( + binding.ivResource0, + binding.ivResource1 + ) + if (it.size != 2) { + resourceViews.forEach { + it.isVisible = false + } + return@observe + } + resourceViews.forEach { + it.isVisible = true + } + for (i in resourceViews.indices) { + resourceViews[i].load(it[i].icon) + resourceViews[i].setOnClickListener { _ -> + when { + it[i].resourceType == 5 -> { + CommonWebViewActivity.start(context, it[i].resourceContent) + } + + else -> { + dialogManager.showProgressDialog(mContext) + homeViewModel.getResourceJumpInfo(it[i].id) + } + } + } + } + } + } + homeViewModel.resourceJumpLiveData.observe(this) { + dialogManager.dismissDialog() + it?.let { + if (it.isPick) { + AVRoomActivity.start(context, it.uid) + } else { + RecommendRoomDialog.newInstance(it).show(context) + } + } + } + homeViewModel.getCurrentResourceInfo() + } + + private fun initBanner() { + val bannerView: BannerViewPager = + binding.bannerView as BannerViewPager + homeViewModel.bannerLiveData.observe(this) { + it?.let { + if (ListUtils.isListEmpty(it)) { + bannerView.visibility = View.GONE + return@let + } + bannerView.visibility = View.VISIBLE + bannerView.adapter = HomeBannerAdapter() + bannerView.post { + binding.bannerView.setPageMargin(UIUtil.dip2px(mContext, 8.0)) + .setScrollDuration(800) + .setOnPageClickListener { _: View?, position: Int -> + CommonJumpHelper.bannerJump(context, it[position]) + } + .create(it) + } + } + } + homeViewModel.getBannerInfo() + } + + override fun onClick(v: View) { + when (v.id) { + R.id.tv_search -> { + //首页_搜索 + ReportManager.get().reportEvent( + IReportConstants.MODULE_HOMEPAGE_CLICK, mapOf( + Pair(IReportConstants.HOMEPAGE_TYPE, IReportConstants.ONE), + Pair(IReportConstants.MODULE, IReportConstants.MOLISTAR_HOMEPAGE) + ) + ) + SearchActivity.start(activity) + //为啥触发条件这么恶心 + if (DemoCache.readAnchorCardView() == 0) { + DemoCache.saveAnchorCardView(1) + } + } + +// R.id.iv_ranking -> { +// //首页_排行榜 +// CommonWebViewActivity.start(mContext, UriProvider.getRanking()) +// } +// +// R.id.iv_my_room -> { +// OpenRoomHelper.openRoom(baseActivity) +// } + } + } + + 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 when (itemId) { + TAB_ID_RECOMMEND.toLong() -> { + RecommendFragment() + } + + TAB_ID_ACCOMPANY.toLong() -> { + AccompanyFragment() + } + + else -> { + return HomeTabFragment.newInstance(itemId.toInt()) + } + } + } + + override fun getItemCount(): Int { + return tabList.size + } + } + ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager) + } + + private fun resetTabIndicator(list: List) { + val commonNavigator = CommonNavigator(context) + if (list.size <= 4) { + commonNavigator.isAdjustMode = true + } + val magicIndicatorAdapter = HomeRecommendIndicatorAdapter( + context, + list + ) + magicIndicatorAdapter.setOnItemSelectListener { position, _ -> + binding.viewPager.currentItem = position + } + commonNavigator.adapter = magicIndicatorAdapter + binding.magicIndicator.navigator = commonNavigator + val titleContainer: LinearLayout = commonNavigator.titleContainer // must after setNavigator + 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) + } + + private fun transformTabList(list: List): List { + return list + } + + 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) + binding.viewPager.adapter?.notifyDataSetChanged() + resetTabIndicator(tabList.map { it.name }) + } + + override fun onDestroyView() { + super.onDestroyView() + tabList.clear() + } + + override fun onItemSelect(position: Int, view: TextView?) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/home/fragment/HomeWithMeFragment.kt b/app/src/main/java/com/chwl/app/home/fragment/HomeWithMeFragment.kt new file mode 100644 index 000000000..1fcf524cf --- /dev/null +++ b/app/src/main/java/com/chwl/app/home/fragment/HomeWithMeFragment.kt @@ -0,0 +1,143 @@ +package com.chwl.app.home.fragment + +import android.widget.LinearLayout +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.chwl.app.R +import com.chwl.app.base.BaseViewBindingFragment +import com.chwl.app.databinding.HomeMeFragmentBinding +import com.chwl.app.home.HomeViewModel +import com.chwl.app.home.helper.OpenRoomHelper +import com.chwl.app.ui.user.adapter.HomeRecommendIndicatorAdapter +import com.chwl.app.ui.widget.magicindicator.ViewPagerHelper +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator +import com.chwl.core.home.bean.HomeTagInfo +import com.chwl.core.home.event.RefreshHomeDataEvent +import com.example.lib_utils.ktx.getDrawableById +import com.example.lib_utils.ktx.singleClick +import org.greenrobot.eventbus.EventBus + +/** +首页 + */ +class HomeWithMeFragment : BaseViewBindingFragment(), + HomeRecommendIndicatorAdapter.OnItemSelectListener { + + private val TAB_ID_RECOMMEND = Int.MAX_VALUE - 1 + + private val TAB_ID_ACCOMPANY = Int.MAX_VALUE - 2 + + private val tabList = mutableListOf() + private val homeViewModel: HomeViewModel by activityViewModels() + + override fun init() { + initListener() + initTab() + homeViewModel.homeTagLiveData.observe(this) { + loadTabList(transformTabList(it)) + } + homeViewModel.getHomeTagInfo() + } + + private fun initListener() { + binding.refreshLayout.setOnRefreshListener { + it.finishRefresh() + EventBus.getDefault().post(RefreshHomeDataEvent()) + homeViewModel.getBannerInfo() + if (binding.viewPager.adapter?.itemCount == 0) { + homeViewModel.getHomeTagInfo() + } + } + binding.refreshLayout.isEnableLoadmore = false + binding.refreshLayout.isEnableOverScrollBounce = false + binding.layoutRoomCard.singleClick { + OpenRoomHelper.openRoom(baseActivity) + } + } + + 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 when (itemId) { + TAB_ID_RECOMMEND.toLong() -> { + RecommendFragment() + } + + TAB_ID_ACCOMPANY.toLong() -> { + AccompanyFragment() + } + + else -> { + return HomeTabFragment.newInstance(itemId.toInt()) + } + } + } + + override fun getItemCount(): Int { + return tabList.size + } + } + ViewPagerHelper.bind(binding.magicIndicator, binding.viewPager) + } + + private fun resetTabIndicator(list: List) { + val commonNavigator = CommonNavigator(context) + if (list.size <= 4) { + commonNavigator.isAdjustMode = true + } + val magicIndicatorAdapter = HomeRecommendIndicatorAdapter( + context, + list + ) + magicIndicatorAdapter.setOnItemSelectListener { position, _ -> + binding.viewPager.currentItem = position + } + commonNavigator.adapter = magicIndicatorAdapter + binding.magicIndicator.navigator = commonNavigator + val titleContainer: LinearLayout = commonNavigator.titleContainer // must after setNavigator + 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) + } + + private fun transformTabList(list: List): List { + return list + } + + 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) + binding.viewPager.adapter?.notifyDataSetChanged() + resetTabIndicator(tabList.map { it.name }) + } + + override fun onDestroyView() { + super.onDestroyView() + tabList.clear() + } + + override fun onItemSelect(position: Int, view: TextView?) { + } +} \ No newline at end of file diff --git a/app/src/main/java/com/chwl/app/ui/user/adapter/MainIndicatorAdapter.java b/app/src/main/java/com/chwl/app/ui/user/adapter/HomeRecommendIndicatorAdapter.java similarity index 88% rename from app/src/main/java/com/chwl/app/ui/user/adapter/MainIndicatorAdapter.java rename to app/src/main/java/com/chwl/app/ui/user/adapter/HomeRecommendIndicatorAdapter.java index 991266761..bf38df914 100644 --- a/app/src/main/java/com/chwl/app/ui/user/adapter/MainIndicatorAdapter.java +++ b/app/src/main/java/com/chwl/app/ui/user/adapter/HomeRecommendIndicatorAdapter.java @@ -1,8 +1,7 @@ package com.chwl.app.ui.user.adapter; import android.content.Context; -import android.graphics.Canvas; -import android.graphics.LinearGradient; +import android.graphics.Color; import android.util.TypedValue; import android.view.Gravity; import android.view.ViewGroup; @@ -13,26 +12,24 @@ import androidx.core.content.ContextCompat; import com.chwl.app.R; import com.chwl.app.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView; -import com.chwl.app.ui.widget.magicindicator.FragmentContainerHelper; import com.chwl.app.ui.widget.magicindicator.buildins.UIUtil; import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter; import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView; -import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.GradientLinePagerIndicator; -import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.model.PositionData; +import com.chwl.app.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator; import java.util.List; -public class MainIndicatorAdapter extends CommonNavigatorAdapter { +public class HomeRecommendIndicatorAdapter extends CommonNavigatorAdapter { private final Context mContext; private final List mTitleList; - private int textSize = 16; + private int textSize = 14; private float minScale = 1f; private boolean showIndicator = true; private OnItemSelectListener mOnItemSelectListener; - public MainIndicatorAdapter(Context context, List charSequences) { + public HomeRecommendIndicatorAdapter(Context context, List charSequences) { this.mContext = context; this.mTitleList = charSequences; } diff --git a/app/src/main/java/com/chwl/app/vip/dialog/VipUpgradeDialog.kt b/app/src/main/java/com/chwl/app/vip/dialog/VipUpgradeDialog.kt index 6bcbeda25..7960ba98f 100644 --- a/app/src/main/java/com/chwl/app/vip/dialog/VipUpgradeDialog.kt +++ b/app/src/main/java/com/chwl/app/vip/dialog/VipUpgradeDialog.kt @@ -3,6 +3,7 @@ package com.chwl.app.vip.dialog import android.annotation.SuppressLint import android.os.Bundle import androidx.fragment.app.activityViewModels +import com.chwl.app.R import com.opensource.svgaplayer.SVGADrawable import com.opensource.svgaplayer.SVGAParser import com.opensource.svgaplayer.SVGAVideoEntity @@ -69,6 +70,6 @@ class VipUpgradeDialog : BaseDialog() { } catch (e: MalformedURLException) { } - binding?.tvLevelDesc?.text = "恭喜你成為「${vipInfo.vipName}」!當前已自動佩戴該等級裝扮,是否保留原有裝扮?" + binding?.tvLevelDesc?.text = getString(R.string.level_up_wear_dress_tips_format).format(vipInfo.vipName) } } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/home_ic_search.png b/app/src/main/res/drawable-xxhdpi/home_ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..770651ab849ac44b518fdf10c2784b4be82b838c GIT binary patch literal 2059 zcmV+m2=w=fP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91EuaGc1ONa40RR91EdT%j07j?LlTWjs#de`q=dqdHfCyc(nzUSy#0?&uzOB^S`1Sp34a0hO}E$EIE z6&3m06Gzcddm`38FTiY=2XkOLC|bc{n_lRGe?Z|K&;m_x5#j#!L@{X5L9D{cU>Q`v z%5bjmao~8lWArlQ*1TD;$P;sD%><*Gi9#0YwKpOl1UxehhEJbkGJCl_D=fGn@tedL6nz;R>7x zuEru*3a*agT{W}+FDU+7*bNN`zsB*AkymsO{4zavz$dUCO2G`7jRr6~F0Ed5+1)7= z>(1Z`IJVh#l4jff3&137fmgxZNAcRF4!(lD(201*$QurtFBH5T6ub%atrKe1miCJ3ZKIg z7!Sp<-%yV98w({+0bjsT=!RZshcDq>a24{#|1<4O*Mc6d1YZ_r_#o_rZ=hvR8K7al zps)71kEp*mx=Py3=ed1OgKcmXI&4FGi#ijjXd0L~mq|NRfd%AJX#)j+2j`zgF#Xd| zJkLDKjjzK^t*{y__N~wgmjWCfMD7yn+jX!JtZs`=4_X{nb~6w1-mnGZxqImGUGM|A z8ySm1;ftA=yHF+)(fnYgmxB!}z!kU+7M%l{;b9fbm`Q|jo4KfgJ>Zt7pO=HHJ|BI# z$sJQ11nXTJxjgzxTQq>%(6Cv8u?7l#ehd`t1ibbIRt+m4wK3<(TWu^yy}Sx$gVz>9 zE%=S#5{_t)ZT);5e4ccIA6{x&7S1{JhiM-V^S}mEzyU0P1JFEDwqWc`1mW?y`rK^m zfQ3+=YY|0jbTjOXN3;1^({3?F(f2sFgPlhsOq|cZ1!^*(3QxB^MMpSILN6&? ztBh8}#QA*nS&&X332&IuT!A)lDg14;!Vfn+9J8)nOlA@ai~g~Jv$3&Dk}e15g$y-l z*_S{~ZU{FZtuaM=!{RgBcF;dotg{`BaHZWGVy5H9pk?kGtp+KU!A4rbl$ z&)50_W?txQ`;uD;^TAB(XjP{bn8@8_TmY=1Xk<`wHs;MdwT@a^h2CZi4% zp8V61^ZlR}MQ#K?A zX49jY(y!u!^{=buZ@)t~BrB^RPHP~FtmIs)Yz9}v`+I1oReB$l>1Y-I4XYLOuMc|* ztoAiv_7vnUV3ri9jSL?aacLt?(EDkGj7Q<#w@npHfK3o})}rM~yx{)8!Jy9cf*m+& zg_B^$7eX0WsHLE2z3W7@h2xbxgBlyOI$5617kX{FWW&`oohu(e@ poWM_T=vf!7w-r7U%(B+${14b0(q+*;o+AJN002ovPDHLkV1gG3trY+O literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/home_ic_search.xml b/app/src/main/res/drawable/home_ic_search.xml deleted file mode 100644 index f2b7b3e71..000000000 --- a/app/src/main/res/drawable/home_ic_search.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/home_me_room_card_bg.xml b/app/src/main/res/drawable/home_me_room_card_bg.xml new file mode 100644 index 000000000..5740a81fc --- /dev/null +++ b/app/src/main/res/drawable/home_me_room_card_bg.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home_recommend_tab_splitter.xml b/app/src/main/res/drawable/home_recommend_tab_splitter.xml new file mode 100644 index 000000000..aa174007a --- /dev/null +++ b/app/src/main/res/drawable/home_recommend_tab_splitter.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 6e9a3a723..d74dbfac5 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -13,163 +13,38 @@ android:src="@drawable/bg_theme_top_home" app:layout_constraintTop_toTopOf="parent" /> - - + + + android:scaleType="fitCenter" + android:src="@drawable/home_ic_search" /> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/layout_title_bar" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home_recommend.xml b/app/src/main/res/layout/fragment_home_recommend.xml new file mode 100644 index 000000000..164ada4d2 --- /dev/null +++ b/app/src/main/res/layout/fragment_home_recommend.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/home_me_fragment.xml b/app/src/main/res/layout/home_me_fragment.xml new file mode 100644 index 000000000..ea89d4fec --- /dev/null +++ b/app/src/main/res/layout/home_me_fragment.xml @@ -0,0 +1,205 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index fa5829c02..539aedf98 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -5298,4 +5298,6 @@ ابدأ PK حاول تقديم الهدايا للآخرين~ الهدايا + 恭喜你成為「%s」!當前已自動佩戴該等級裝扮,是否保留原有裝扮? + 歡迎來到我的房間 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bfc138a2f..1f081a413 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -3198,7 +3198,7 @@ 青少年保護 拉拉 · 紅隊勝利 · - 查看藍隊戰績 + 查看藍隊戰績> 同意 不同意並退出 用戶協議 @@ -5240,4 +5240,7 @@ 開始PK 试试给其他人送出您的心意吧~ 送禮 + 恭喜你成為「%s」!當前已自動佩戴該等級裝扮,是否保留原有裝扮? + 歡迎來到我的房間 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29170205c..bfac4c7fd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5279,6 +5279,8 @@ You cannot join again within 24 hours after leaving Start PK Try giving gifts to other people~ Gift + 恭喜你成為「%s」!當前已自動佩戴該等級裝扮,是否保留原有裝扮? + 歡迎來到我的房間