From 9de8e61b1baabb15a22055bc4f6e26cd0eefa481 Mon Sep 17 00:00:00 2001 From: kehaoyuan Date: Mon, 11 Nov 2019 19:40:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=89=88=E9=A6=96=E9=A1=B5=E5=85=BC?= =?UTF-8?q?=E5=AE=B9=E4=B8=93=E9=A2=98/=E6=8F=92=E4=BB=B6=E5=8C=96?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E7=9B=B8=E5=85=B3=E9=83=A8=E5=88=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/databind/BindingAdapters.java | 13 +- .../com/gh/gamecenter/entity/GameEntity.kt | 1 + .../com/gh/gamecenter/entity/HomeContent.kt | 2 +- .../com/gh/gamecenter/entity/HomeSetting.kt | 2 +- .../gh/gamecenter/game/GameFragmentAdapter.kt | 2 - .../gh/gamecenter/game/data/GameItemData.kt | 9 +- .../com/gh/gamecenter/home/HomeFragment.kt | 15 + .../gh/gamecenter/home/HomeFragmentAdapter.kt | 308 +++++++++++++++++- .../gamecenter/home/HomeGameItemViewHolder.kt | 20 +- .../com/gh/gamecenter/home/HomeItemData.kt | 20 +- .../com/gh/gamecenter/home/HomeViewModel.kt | 301 ++++++++++++++++- .../gamecenter/home/amway/HomeAmwayAdapter.kt | 28 ++ .../home/amway/HomeAmwayItemViewHolder.kt | 5 +- .../home/amway/HomeAmwayListViewHolder.kt | 26 ++ .../home/slide/HomeSlideListItemViewHolder.kt | 14 +- .../home/slide/HomeSlideListViewHolder.kt | 2 + app/src/main/res/layout/game_attach_item.xml | 8 +- .../layout/game_column_collection_list.xml | 1 + app/src/main/res/layout/home_amway_item.xml | 14 + app/src/main/res/layout/home_amway_list.xml | 23 ++ app/src/main/res/layout/home_game_item.xml | 14 +- app/src/main/res/layout/home_slide_list.xml | 3 +- 22 files changed, 776 insertions(+), 55 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayListViewHolder.kt create mode 100644 app/src/main/res/layout/home_amway_list.xml diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 59c223be76..c3c52f4380 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -551,21 +551,24 @@ public class BindingAdapters { return; } + int showCount = tags.size() > 3 ? 3 : tags.size(); // 最多显示3个 + StringBuilder content = new StringBuilder(); - for (int i = 0; i < tags.size(); i++) { + for (int i = 0; i < showCount; i++) { TagStyleEntity tag = tags.get(i); content.append(tag.getName()); - if (i != tags.size() - 1) content.append("/"); + if (i != showCount - 1) content.append("/"); } Spannable span = new SpannableString(content); int index = 0; - for (int i = 0; i < tags.size(); i++) { + for (int i = 0; i < showCount; i++) { TagStyleEntity tag = tags.get(i); int start = index; - int end = start + tag.getName().length() + ((i != tags.size() - 1) ? 1 : 0); + int end = start + tag.getName().length() + ((i != showCount - 1) ? 1 : 0); index = end; - span.setSpan(new ForegroundColorSpan(Color.parseColor(tag.getColor())), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + span.setSpan(new ForegroundColorSpan(Color.parseColor("#" + tag.getColor())), + start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } view.setText(span); } diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index cedf6870d8..80603a3724 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -134,6 +134,7 @@ data class GameEntity( val games: List? = null, //首页设置 + @SerializedName("home_setting") val homeSetting: HomeSetting = HomeSetting(), // 游戏评分 val star: Float = 10F, diff --git a/app/src/main/java/com/gh/gamecenter/entity/HomeContent.kt b/app/src/main/java/com/gh/gamecenter/entity/HomeContent.kt index 2d1ef15b37..fc2415b1ca 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/HomeContent.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/HomeContent.kt @@ -13,4 +13,4 @@ data class HomeContent(@SerializedName("link_type") @SerializedName("link_column") val linkColumn: SubjectEntity? = null, @SerializedName("link_top_game_comment") - val linkTopGameComment: Any? = null) \ No newline at end of file + val linkTopGameComment: List? = null) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/HomeSetting.kt b/app/src/main/java/com/gh/gamecenter/entity/HomeSetting.kt index 4d9f80343a..6746a36649 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/HomeSetting.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/HomeSetting.kt @@ -6,6 +6,6 @@ import kotlinx.android.parcel.Parcelize @Parcelize data class HomeSetting(var image: String = "", - val tags: List = ArrayList(), + val tags: ArrayList = ArrayList(), @SerializedName("text_color") val textColor: String = "") : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt index a4322062ed..572a629868 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt @@ -59,8 +59,6 @@ class GameFragmentAdapter(context: Context, private val mPluginPosition = 1 - private val mVerticalSlideIndexKey = "VerticalSlideIndex" - private val mViewModel: GameViewModel = model private var mLoadStatus: LoadStatus? = null diff --git a/app/src/main/java/com/gh/gamecenter/game/data/GameItemData.kt b/app/src/main/java/com/gh/gamecenter/game/data/GameItemData.kt index a35718c861..e62dbdacd1 100644 --- a/app/src/main/java/com/gh/gamecenter/game/data/GameItemData.kt +++ b/app/src/main/java/com/gh/gamecenter/game/data/GameItemData.kt @@ -1,10 +1,7 @@ package com.gh.gamecenter.game.data import com.gh.common.exposure.ExposureEvent -import com.gh.gamecenter.entity.GameEntity -import com.gh.gamecenter.entity.LinkEntity -import com.gh.gamecenter.entity.SubjectEntity -import com.gh.gamecenter.entity.SubjectRecommendEntity +import com.gh.gamecenter.entity.* class GameItemData { var game: GameEntity? = null @@ -19,6 +16,10 @@ class GameItemData { var imageSlide: GameEntity? = null var columnCollection: SubjectEntity? = null + var homeSlides: List? = null + var homeRecommends: List? = null + var homeGame: GameEntity? = null + var exposureEvent: ExposureEvent? = null var exposureEventList: List? = null } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt index 51fbd85306..3ee43784cb 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt @@ -5,6 +5,7 @@ import android.view.View import androidx.core.content.ContextCompat import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.gh.base.fragment.BaseFragment import com.gh.common.util.observeNonNull import com.gh.common.view.FixLinearLayoutManager @@ -38,6 +39,7 @@ class HomeFragment : BaseFragment() { }) mViewModel.loadStatus.observeNonNull(this, callback = { mBinding.loadStatus = it + mListAdapter.setLoadStatus(it) mNoConn.visibility = if (it == LoadStatus.INIT_FAILED) View.VISIBLE else View.GONE mLoading.visibility = if (it == LoadStatus.INIT_LOADING) View.VISIBLE else View.GONE }) @@ -52,5 +54,18 @@ class HomeFragment : BaseFragment() { mListAdapter = HomeFragmentAdapter(requireContext(), mViewModel) mBinding.gameList.layoutManager = mLayoutManager mBinding.gameList.adapter = mListAdapter + + mBinding.gameList.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (mLayoutManager.findLastVisibleItemPosition() == mListAdapter.itemCount - 1 + && RecyclerView.SCROLL_STATE_IDLE == newState) mViewModel.getHomeContent(false) + } + }) + + mBinding.gameRefresh.setOnRefreshListener { + mViewModel.initData() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt index 8ecfda4959..cdde284dbf 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt @@ -1,27 +1,71 @@ package com.gh.gamecenter.home import android.content.Context +import android.graphics.drawable.Animatable import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout +import androidx.recyclerview.widget.DefaultItemAnimator +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.facebook.drawee.controller.BaseControllerListener +import com.facebook.imagepipeline.image.ImageInfo +import com.gh.base.OnViewClickListener +import com.gh.common.constant.ItemViewType +import com.gh.common.util.* +import com.gh.gamecenter.GameDetailActivity import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.adapter.viewholder.GameHeadViewHolder +import com.gh.gamecenter.adapter.viewholder.GameImageViewHolder +import com.gh.gamecenter.adapter.viewholder.GameViewHolder import com.gh.gamecenter.baselist.DiffUtilAdapter -import com.gh.gamecenter.databinding.HomeGameItemBinding -import com.gh.gamecenter.databinding.HomeRecommendItemBinding -import com.gh.gamecenter.databinding.HomeSlideListBinding +import com.gh.gamecenter.baselist.LoadStatus +import com.gh.gamecenter.databinding.* +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.entity.LinkEntity +import com.gh.gamecenter.game.GameItemViewHolder +import com.gh.gamecenter.game.columncollection.GameColumnCollectionViewHolder +import com.gh.gamecenter.game.columncollection.detail.ColumnCollectionDetailActivity +import com.gh.gamecenter.game.horizontal.GameHorizontalListViewHolder +import com.gh.gamecenter.game.imageslide.GameImageSlideViewHolder +import com.gh.gamecenter.game.vertical.GameVerticalSlideViewHolder +import com.gh.gamecenter.home.amway.HomeAmwayItemViewHolder import com.gh.gamecenter.home.slide.HomeSlideListViewHolder +import com.gh.gamecenter.subject.SubjectActivity +import com.halo.assistant.fragment.game.GamePluginAdapter +import com.halo.assistant.fragment.game.GamePluginViewHolder +import java.util.* class HomeFragmentAdapter(context: Context, val viewModel: HomeViewModel) : DiffUtilAdapter(context) { + private var mLoadStatus: LoadStatus? = null + private var mIsOpenPluginList: Boolean = false + + fun setLoadStatus(status: LoadStatus) { + this.mLoadStatus = status + notifyItemChanged(itemCount - 1) + } + + override fun getItemViewType(position: Int): Int { if (itemCount == position + 1) return FOOTER_ITEM val itemData = mDataList[position] if (itemData.slides != null) return SLIDE_ITEM if (itemData.recommends != null) return RECOMMENDS_ITEM - if (itemData.game != null) return GAME_ITEM + if (itemData.attachGame != null) return GAME_ITEM + if (itemData.amway != null) return AMWAY_ITEM + + if (itemData.pluginList != null) return ItemViewType.GAME_PLUGIN + if (itemData.columnHead != null) return ItemViewType.COLUMN_HEADER + if (itemData.game != null) return ItemViewType.GAME_NORMAL + if (itemData.image != null) return ItemViewType.GAME_IMAGE + if (itemData.horizontalColumn != null || itemData.horizontalSlide != null) return ItemViewType.GAME_SUBJECT + if (itemData.imageSlide != null) return ItemViewType.IMAGE_SLIDE_ITEM + if (itemData.verticalSlide != null) return ItemViewType.VERTICAL_SLIDE_ITEM + if (itemData.columnCollection != null) return ItemViewType.COLUMN_COLLECTION return super.getItemViewType(position) } @@ -40,10 +84,42 @@ class HomeFragmentAdapter(context: Context, view = mLayoutInflater.inflate(R.layout.home_game_item, parent, false) HomeGameItemViewHolder(HomeGameItemBinding.bind(view)) } + AMWAY_ITEM -> { + view = mLayoutInflater.inflate(R.layout.home_amway_item, parent, false) + HomeAmwayItemViewHolder(HomeAmwayItemBinding.bind(view)) + } FOOTER_ITEM -> { view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) FooterViewHolder(view) } + ItemViewType.LOADING -> { + FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)) + } + ItemViewType.GAME_SUBJECT -> { + val binding = GameHorizontalListBinding.bind(mLayoutInflater.inflate(R.layout.game_horizontal_list, parent, false)) + GameHorizontalListViewHolder(binding) + } + ItemViewType.GAME_NORMAL -> { + GameItemViewHolder(GameItemBinding.bind(mLayoutInflater.inflate(R.layout.game_item, parent, false))) + } + ItemViewType.GAME_IMAGE -> { + GameImageViewHolder(GameImageItemBinding.bind(mLayoutInflater.inflate(R.layout.game_image_item, parent, false))) + } + ItemViewType.COLUMN_HEADER -> { + GameHeadViewHolder(GameHeadItemBinding.bind(mLayoutInflater.inflate(R.layout.game_head_item, parent, false))) + } + ItemViewType.GAME_PLUGIN -> { + GamePluginViewHolder(mLayoutInflater.inflate(R.layout.game_plugin_item, parent, false)) + } + ItemViewType.IMAGE_SLIDE_ITEM -> { + GameImageSlideViewHolder(GameImageSlideItemBinding.bind(mLayoutInflater.inflate(R.layout.game_image_slide_item, parent, false))) + } + ItemViewType.VERTICAL_SLIDE_ITEM -> { + GameVerticalSlideViewHolder(GameVerticalSlideItemBinding.bind(mLayoutInflater.inflate(R.layout.game_vertical_slide_item, parent, false))) + } + ItemViewType.COLUMN_COLLECTION -> { + GameColumnCollectionViewHolder(GameColumnCollectionListBinding.bind(mLayoutInflater.inflate(R.layout.game_column_collection_list, parent, false))) + } else -> throw NullPointerException() } } @@ -56,7 +132,228 @@ class HomeFragmentAdapter(context: Context, when (holder) { is HomeSlideListViewHolder -> holder.bindSlideList(mDataList[position].slides!!) is HomeRecommendItemViewHolder -> holder.bindRecommend(mDataList[position].recommends!!) - is HomeGameItemViewHolder -> holder.bindGame(mDataList[position].game!!) + is HomeGameItemViewHolder -> holder.bindGame(mDataList[position].attachGame!!) + is GameHeadViewHolder -> bindHeadView(holder, position) + is GamePluginViewHolder -> bindPluginView(holder, position) + is GameItemViewHolder -> bindGameItemView(holder, position) + is FooterViewHolder -> bindFooterView(holder) + is GameImageViewHolder -> bindGameImageView(holder, position) + is GameHorizontalListViewHolder -> bindGameHorizontalListView(holder, position) + is GameImageSlideViewHolder -> bindGameImageSlide(holder, position) + is GameVerticalSlideViewHolder -> bindVerticalSlide(holder, position) + is GameColumnCollectionViewHolder -> bindColumnCollection(holder, position) + } + } + + private fun bindColumnCollection(holder: GameColumnCollectionViewHolder, position: Int) { + val columnCollection = mDataList[position].columnCollection!! + val itemClick = OnViewClickListener { _, data -> + MtaHelper.onEvent("游戏专题合集", "首页合集图片", columnCollection.name) + DirectUtils.directToLinkPage(mContext, LinkEntity(link = data.link, type = data.type), "(首页游戏)", "游戏-专题") + } + holder.bindColumnCollection(columnCollection, itemClick) + + val dataList = columnCollection.data!! + if (dataList.size == 1) { + val data = dataList[0] + holder.binding.columnCollectionImage.setOnClickListener { + MtaHelper.onEvent("游戏专题合集", "首页合集图片", columnCollection.name) + DirectUtils.directToLinkPage(mContext, LinkEntity(link = data.link, type = data.type), "(首页游戏)", "游戏-专题") + } + } else { + holder.binding.columnCollectionList.doOnScrolledSpecificDistance(distanceX = DisplayUtils.dip2px(24f), singleTimeEvent = true) { + MtaHelper.onEvent("游戏专题", "滑动", columnCollection.name) + } + } + } + + private fun bindVerticalSlide(holder: GameVerticalSlideViewHolder, position: Int) { + val verticalSlide = mDataList[position].verticalSlide!! + val itemClick = OnViewClickListener { _, data -> + val subjectData = data.subjectData + DataCollectionUtils.uploadClick(mContext, subjectData?.name + "-列表", "游戏-专题", data.name) + GameDetailActivity.startGameDetailActivity(mContext, data, + StringUtils.buildString("(首页-专题:", subjectData?.name, "-列表[", (subjectData?.position).toString(), "])")) + } + holder.bindVerticalSlide(verticalSlide, itemClick) + + } + + private fun bindGameImageSlide(holder: GameImageSlideViewHolder, position: Int) { + val binding = holder.binding + val entity = mDataList[position].imageSlide + + if (binding.columnList.adapter == null) { + binding.columnList.doOnScrolledSpecificDistance(distanceX = DisplayUtils.dip2px(24f), singleTimeEvent = true) { + MtaHelper.onEvent("游戏专题", "滑动", entity?.name) + } + } + + val imageClickListener = View.OnClickListener { + DataCollectionUtils.uploadClick(mContext, entity?.name + "-大图", "游戏-专题") + MtaHelper.onEvent("游戏专题", "底部图片", entity?.name) + val linkEntity = LinkEntity() + linkEntity.link = entity?.link + linkEntity.type = entity?.type + DirectUtils.directToLinkPage(mContext, linkEntity, "(游戏-专题:" + entity?.name + "-大图)", "首页游戏") + } + + holder.bindImageSlide(entity!!, imageClickListener, "游戏-专题") + } + + private fun bindGameHorizontalListView(holder: GameHorizontalListViewHolder, position: Int) { + val subjectEntity = mDataList[position].horizontalColumn + ?: mDataList[position].horizontalSlide + holder.bindHorizontalList(subjectEntity!!) + + } + + private fun bindGameImageView(holder: GameImageViewHolder, position: Int) { + val entity = mDataList[position].image + + holder.binding.game = entity + + val name = entity?.subjectData?.name + val link = entity?.link + val width = mContext.resources.displayMetrics.widthPixels - DisplayUtils.dip2px(mContext, 16F) + ImageUtils.display(holder.binding.gameImageIcon, entity?.image, width, object : BaseControllerListener() { + override fun onFinalImageSet(id: String?, imageInfo: ImageInfo?, animatable: Animatable?) { + if (imageInfo == null) return + val imageParams = holder.binding.gameImageIcon.layoutParams + val scale = imageInfo.height.toFloat() / imageInfo.width.toFloat() + imageParams?.height = (width * scale).toInt() + holder.binding.gameImageIcon.layoutParams = imageParams + holder.binding.gameContainer.layoutParams.height = (width * scale).toInt() + } + }) + holder.binding.gameImageIcon.setOnClickListener { + DataCollectionUtils.uploadClick(mContext, "$name-大图", "游戏-专题") + MtaHelper.onEvent("游戏专题", "大图", name + ":" + entity?.name) + val linkEntity = LinkEntity() + linkEntity.link = link + linkEntity.type = entity?.type + DirectUtils.directToLinkPage(mContext, linkEntity, "(游戏-专题:$name-大图)", "首页游戏") + } + } + + private fun bindFooterView(holder: FooterViewHolder) { + holder.initFooterViewHolder(mLoadStatus == LoadStatus.LIST_LOADING + , mLoadStatus == LoadStatus.LIST_FAILED + , mLoadStatus == LoadStatus.LIST_OVER) { + if (mLoadStatus == LoadStatus.LIST_FAILED) { + viewModel.getHomeContent(false) + notifyItemChanged(itemCount - 1) + } + } + } + + private fun bindGameItemView(holder: GameItemViewHolder, position: Int) { + val itemData = mDataList[position] + val gameEntity = itemData.game + val subjectData = gameEntity?.subjectData!! + + if (mDataList.size == position + 1 || mDataList[position + 1].game == null) { + holder.itemView.setPadding( + DisplayUtils.dip2px(16F), DisplayUtils.dip2px(4F), + DisplayUtils.dip2px(20F), DisplayUtils.dip2px(12F)) + } else { + holder.itemView.setPadding( + DisplayUtils.dip2px(16F), DisplayUtils.dip2px(4F), + DisplayUtils.dip2px(20F), DisplayUtils.dip2px(4F)) + } + + holder.binding.game = gameEntity + holder.binding.subjectTag = subjectData?.tag + holder.initServerType(gameEntity!!) + holder.binding.executePendingBindings() + + + DownloadItemUtils.setOnClickListener(mContext, holder.binding.downloadBtn, gameEntity, position, + this@HomeFragmentAdapter, + StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (position + 1).toString(), "])"), + StringUtils.buildString("游戏-专题-", subjectData.name, ":", gameEntity.name)) + DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), !gameEntity.isPluggable) + holder.itemView.setOnClickListener { + DataCollectionUtils.uploadClick(mContext, subjectData.name + "-列表", "游戏-专题", gameEntity.name) + + if (gameEntity.isPluggable) { + GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, + StringUtils.buildString("(游戏-专题:插件化-列表[", (subjectData.position).toString(), "])")) + } else { + GameDetailActivity.startGameDetailActivity(mContext, gameEntity, + StringUtils.buildString("(游戏-专题:", subjectData.name, "-列表[", (subjectData.position).toString(), "])")) + } + } + } + + private fun bindHeadView(holder: GameHeadViewHolder, position: Int) { + val column = mDataList[position].columnHead + holder.binding.subject = column + holder.binding.headPb.visibility = View.GONE + val text = if ("change" == column?.home) "换一批" else "全部 >" + holder.binding.headMore.text = text + + if (text == "全部 >" + && column != null + && column.data != null + && column.data!!.size >= column.more!! + && column.type != "column_collection") { + holder.binding.headMore.visibility = View.GONE + } else { + holder.binding.headMore.visibility = View.VISIBLE + } + + holder.binding.headMore.setOnClickListener { + if ("change" == column!!.home) { + MtaHelper.onEvent("游戏专题", "换一批", column.name) + holder.binding.headPb.visibility = View.VISIBLE + viewModel.changeSubjectGame(column.id!!) + } else { + if (column.type == "column_collection") { + MtaHelper.onEvent("游戏专题合集", "全部", column.name) + mContext.startActivity(ColumnCollectionDetailActivity.getIntent(mContext, column.id!!, "(游戏-专题:" + column.name + "-全部)")) + } else { + MtaHelper.onEvent("游戏专题", "全部", column.name) + SubjectActivity.startSubjectActivity(mContext, column.id, column.getFilterName(), column.isOrder, "(游戏-专题:" + column.name + "-全部)") + } + } + } + } + + private fun bindPluginView(holder: GamePluginViewHolder, position: Int) { + val pluginList = mDataList[position].pluginList + var adapter = holder.mPluginRv.adapter + + val layoutParams = holder.mPluginHead.layoutParams as LinearLayout.LayoutParams + if (mIsOpenPluginList) { + holder.mHeadOpen.setImageResource(R.drawable.gamedetail_colse_icon) + layoutParams.setMargins(0, DisplayUtils.dip2px(4F), 0, 0) + } else { + holder.mHeadOpen.setImageResource(R.drawable.gamedetail_open_icon) + layoutParams.setMargins(0, DisplayUtils.dip2px(4F), 0, DisplayUtils.dip2px(4F)) + } + + if (adapter == null) { + adapter = GamePluginAdapter(mContext, pluginList) + adapter.openList(mIsOpenPluginList) + (holder.mPluginRv.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false + holder.mPluginRv.layoutManager = LinearLayoutManager(mContext) + holder.mPluginRv.adapter = adapter + } else { + (adapter as GamePluginAdapter).openList(mIsOpenPluginList) + adapter.checkResetData(pluginList) + } + + holder.mHeadTitle.text = String.format(Locale.getDefault(), "你有%d个游戏可以升级插件版", pluginList?.size) + holder.mPluginHead.setOnClickListener { + if (mIsOpenPluginList) { + mIsOpenPluginList = false + MtaHelper.onEvent("首页_点击", "插件化区域", "收起") + } else { + mIsOpenPluginList = true + MtaHelper.onEvent("首页_点击", "插件化区域", "展开") + } + notifyItemChanged(holder.adapterPosition) } } @@ -64,6 +361,7 @@ class HomeFragmentAdapter(context: Context, const val SLIDE_ITEM: Int = 100 const val RECOMMENDS_ITEM: Int = 101 const val GAME_ITEM: Int = 102 + const val AMWAY_ITEM: Int = 103 const val FOOTER_ITEM: Int = 110 } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt index 5060c53a0a..c836bc2807 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeGameItemViewHolder.kt @@ -1,11 +1,29 @@ package com.gh.gamecenter.home import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.NumberUtils +import com.gh.common.util.toColor +import com.gh.gamecenter.R import com.gh.gamecenter.databinding.HomeGameItemBinding import com.gh.gamecenter.entity.GameEntity class HomeGameItemViewHolder(val binding: HomeGameItemBinding) : BaseRecyclerViewHolder(binding.root) { + fun bindGame(game: GameEntity) { - binding + val homeTags = game.homeSetting.tags + if (homeTags.isNotEmpty()) game.tagStyle = homeTags + binding.data = game + + if (game.commentCount < 10 || game.star < 7.0) { + binding.ratingBackground.setImageResource(R.drawable.home_visit_background) + binding.ratingScore.setTextColor(R.color.theme.toColor()) + binding.ratingScore.textSize = 10F + binding.ratingScore.text = (NumberUtils.transSimpleCount(game.visit) + "人\n想玩") + } else { + binding.ratingBackground.setImageResource(R.drawable.home_rating_background) + binding.ratingScore.setTextColor(R.color.white.toColor()) + binding.ratingScore.textSize = 18F + binding.ratingScore.text = game.star.toString() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeItemData.kt b/app/src/main/java/com/gh/gamecenter/home/HomeItemData.kt index 9a26b041d9..4b97f8bde3 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeItemData.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeItemData.kt @@ -1,9 +1,19 @@ package com.gh.gamecenter.home -import com.gh.gamecenter.entity.GameEntity -import com.gh.gamecenter.entity.HomeRecommend -import com.gh.gamecenter.entity.HomeSlide +import com.gh.gamecenter.entity.* data class HomeItemData(var slides: List? = null, - var recommends: List?= null, - var game: GameEntity? =null) \ No newline at end of file + var recommends: List? = null, + var amway: List? = null, + var attachGame: GameEntity? = null, + + var game: GameEntity? = null, + var columnHead: SubjectEntity? = null, + var horizontalColumn: SubjectEntity? = null, + var subjectRecommend: List? = null, + var image: GameEntity? = null, + var pluginList: List? = null, + var verticalSlide: SubjectEntity? = null, + var horizontalSlide: SubjectEntity? = null, + var imageSlide: GameEntity? = null, + var columnCollection: SubjectEntity? = null) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt index 72ffec4d63..056ea2adac 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt @@ -2,31 +2,55 @@ package com.gh.gamecenter.home import android.annotation.SuppressLint import android.app.Application +import android.text.TextUtils +import androidx.collection.ArrayMap import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData +import com.gh.common.util.ApkActiveUtils +import com.gh.common.util.GameUtils +import com.gh.common.util.RandomUtils +import com.gh.download.DownloadManager import com.gh.gamecenter.baselist.LoadStatus -import com.gh.gamecenter.entity.HomeContent -import com.gh.gamecenter.entity.HomeRecommend -import com.gh.gamecenter.entity.HomeSlide +import com.gh.gamecenter.entity.* +import com.gh.gamecenter.game.data.GameSubjectData +import com.gh.gamecenter.packagehelper.PackageRepository import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import retrofit2.HttpException +import java.util.HashMap +import kotlin.collections.ArrayList +import kotlin.collections.set class HomeViewModel(application: Application) : AndroidViewModel(application) { private val mApi = RetrofitManager.getInstance(application).api + private val mSnapshotItemList = ArrayList() + private val mSubjectChangedMap: ArrayMap> = ArrayMap() // 存储换一换的数据 + private val mHomeSlides = ArrayList() private val mHomeRecommends = ArrayList() private val mHomeContents = ArrayList() + private var mPluginList: List? = null // 插件化 + private var mSmartSubject: SubjectEntity? = null // 智能推荐专题 + + private var mContentPage = 1 // 专题分页 + private var mIsLoading = false var itemDataList: MediatorLiveData> = MediatorLiveData() + var positionAndPackageMap = HashMap() // key: packageName + position, value: position val loadStatus = MutableLiveData() init { + itemDataList.addSource(PackageRepository.gameUpdateLiveData) { + initPlugin(it) + } initData() } @@ -37,6 +61,23 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { loadStatus.postValue(LoadStatus.INIT_LOADING) getHomeSlides() + getSmartColumn() + } + + private fun initPlugin(updateList: List?) { + if (updateList == null) return + + val list = ArrayList() + for (update in updateList) { + if (update.isPluggable && update.isShowPlugin(PluginLocation.only_index)) { + list.add(update.transformGameEntity()) + } + } + for (game in list) { + game.setEntryMap(DownloadManager.getInstance(getApplication()).getEntryMap(game.name)) + } + mPluginList = list + transformationItemData() } @@ -65,18 +106,28 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { .subscribe(object : BiResponse>() { override fun onSuccess(data: List) { mHomeRecommends.addAll(data) - getHomeContent(1) + transformationItemData() + getHomeContent(true) } override fun onFailure(exception: Exception) { - getHomeContent(1) + getHomeContent(true) } }) } @SuppressLint("CheckResult") - fun getHomeContent(page: Int) { - mApi.getHomeContents(page) + fun getHomeContent(initData: Boolean) { + if (mIsLoading && !initData || loadStatus.value == LoadStatus.LIST_OVER) return + mIsLoading = true + + if (initData) { + mContentPage = 1 + } else { + loadStatus.postValue(LoadStatus.LIST_LOADING) + } + + mApi.getHomeContents(mContentPage) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BiResponse>() { @@ -86,41 +137,263 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { } else { mHomeContents.addAll(data) transformationItemData() - if (page == 1) { + if (initData) { loadStatus.postValue(LoadStatus.INIT_LOADED) } else { loadStatus.postValue(LoadStatus.LIST_LOADED) } } + + mContentPage++ + mIsLoading = false } override fun onFailure(exception: Exception) { - transformationItemData() + if (initData && mHomeSlides.isEmpty() && mHomeRecommends.isEmpty()) { + loadStatus.postValue(LoadStatus.INIT_FAILED) + } else { + loadStatus.postValue(LoadStatus.LIST_FAILED) + } + mIsLoading = false } }) } + private fun getSmartColumn() { + mApi.smartColumn + .map { + val gameList = it.data + if (gameList != null) { + for (game in gameList) { + ApkActiveUtils.filterHideApk(game) + } + } + it + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: SubjectEntity?) { + mSmartSubject = response + } + }) + } + + fun changeSubjectGame(subjectId: String) { + val list = mSubjectChangedMap[subjectId] + if (list != null) { + initRandomGame(subjectId, ArrayList(list)) + } else { + getChangeSubjectGame(subjectId) + } + } + + //换一批 + private fun getChangeSubjectGame(subjectId: String) { + mApi + .getSubjectGame(subjectId) + .map(ApkActiveUtils.filterMapperList) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response>() { + + override fun onResponse(response: List?) { + if (response != null) { + mSubjectChangedMap[subjectId] = response + initRandomGame(subjectId, java.util.ArrayList(response)) + } + } + + override fun onFailure(e: HttpException?) { + Utils.toast(getApplication(), "网络异常") + } + }) + + } + + // 随机产生专题数据(换一换) + private fun initRandomGame(subjectId: String, sourceList: List?) { + + var rawList: MutableList? = null + for (entity in mHomeContents) { + if (entity.linkColumn?.id == subjectId) rawList = entity.linkColumn?.data + } + if (rawList == null) return + + var sourceList = sourceList + + var size = rawList.size // 判断是否有大图 + + var i = 0 + while (i < rawList.size) { //删除原数据,排除大图 + if (TextUtils.isEmpty(rawList[i].image)) { + rawList.removeAt(i) + i-- + } else { + size-- + } + i++ + } + + if (size * 2 <= sourceList!!.size) { + sourceList = GameUtils.removeDuplicateData(rawList, sourceList)//排除重复 + } + + val indexes = RandomUtils.getRandomArray(size, sourceList!!.size) + for (index in indexes) { + val gameEntity = sourceList[index] + rawList.add(gameEntity) + } + transformationItemData() + } + fun transformationItemData() { - val snapshotItemList = ArrayList() + mSnapshotItemList.clear() + if (mSmartSubject != null && mHomeContents.size > mSmartSubject!!.sort) { + val element = HomeContent( + linkType = "smart_subject", + linkId = mSmartSubject?.id ?: "", + linkText = mSmartSubject?.name ?: "", + linkColumn = mSmartSubject) + mHomeContents.add(mSmartSubject!!.sort, element) + mSmartSubject = null // 防止重复插入 + } + if (mHomeSlides.isNotEmpty()) { val slideItem = HomeItemData() slideItem.slides = mHomeSlides - snapshotItemList.add(slideItem) + mSnapshotItemList.add(slideItem) } if (mHomeRecommends.isNotEmpty()) { val recommend = HomeItemData() recommend.recommends = mHomeRecommends - snapshotItemList.add(recommend) + mSnapshotItemList.add(recommend) + } + + // 插件化 + if (mPluginList != null && mPluginList!!.isNotEmpty()) { + val plugin = HomeItemData() + plugin.pluginList = mPluginList + mSnapshotItemList.add(plugin) + + for (entity in mPluginList!!) { + addGamePositionAndPackage(entity) + } } for (homeContent in mHomeContents) { val linkType = homeContent.linkType if (linkType == "game") { - + val attachGame = HomeItemData() + attachGame.attachGame = homeContent.linkGame + mSnapshotItemList.add(attachGame) + } else if (linkType == "top_game_comment") { + val amway = HomeItemData() + amway.amway = homeContent.linkTopGameComment + mSnapshotItemList.add(amway) + } else if (linkType == "column" + || linkType == "column_collection" + || linkType == "smart_subject") { + transformationSubject(homeContent.linkColumn) } } - itemDataList.postValue(snapshotItemList) + itemDataList.postValue(mSnapshotItemList) } + + private fun transformationSubject(subjectEntity: SubjectEntity?) { + // 专题 "type": "image/game_vertical/game_horizontal" + val data = subjectEntity?.data + if (data == null || data.isEmpty()) return + + if (!data[0].image.isNullOrEmpty() && subjectEntity.type != "column_collection") { + val itemDataImage = HomeItemData() + val gameEntity = data[0] + if (gameEntity.id.isNullOrEmpty()) gameEntity.id = gameEntity.link ?: "" + + if (data[0].type == "column") { + itemDataImage.imageSlide = gameEntity + mSnapshotItemList.add(itemDataImage) + } else { + itemDataImage.image = gameEntity + itemDataImage.image?.subjectData = GameSubjectData(name = subjectEntity.name, isOrder = false) + mSnapshotItemList.add(itemDataImage) + if (gameEntity.type == "game") addGamePositionAndPackage(gameEntity) + } + if (subjectEntity.type == "image" || subjectEntity.type == "image_slide") return + } + + val itemDataHead = HomeItemData() + itemDataHead.columnHead = subjectEntity + mSnapshotItemList.add(itemDataHead) + + if (subjectEntity.type == "game_vertical_slide") { + val itemVerticalSlide = HomeItemData() + itemVerticalSlide.verticalSlide = subjectEntity + mSnapshotItemList.add(itemVerticalSlide) + + for (i in 0 until data.size) { + val game = data[i] + if (!game.image.isNullOrEmpty()) continue + game.subjectData = GameSubjectData( + name = subjectEntity.name, + tag = subjectEntity.tag, + position = i + if (data[0].image.isNullOrEmpty()) 1 else 0, + isOrder = subjectEntity.isOrder) + + addGamePositionAndPackage(game) + } + return + } + + if (subjectEntity.type == "game_horizontal_slide") { + val itemHorizontalSlide = HomeItemData() + itemHorizontalSlide.horizontalSlide = subjectEntity + mSnapshotItemList.add(itemHorizontalSlide) + return + } + + if (subjectEntity.type == "game_horizontal") { + val itemDataSubject = HomeItemData() + itemDataSubject.horizontalColumn = subjectEntity + mSnapshotItemList.add(itemDataSubject) + return + } + + if (subjectEntity.type == "column_collection") { + val itemColumnCollection = HomeItemData() + itemColumnCollection.columnCollection = subjectEntity + mSnapshotItemList.add(itemColumnCollection) + return + } + + for (i in 0 until data.size) { + val game = data[i] + if (!game.image.isNullOrEmpty()) continue + + game.subjectData = GameSubjectData( + name = subjectEntity.name, + tag = subjectEntity.tag, + position = i + if (data[0].image.isNullOrEmpty()) 1 else 0, + isOrder = subjectEntity.isOrder) + val itemDataGame = HomeItemData() + game.sequence = i + itemDataGame.game = game + mSnapshotItemList.add(itemDataGame) + addGamePositionAndPackage(game) + } + } + + + private fun addGamePositionAndPackage(game: GameEntity) { + var packages = "" + for (apkEntity in game.getApk()) { + packages += apkEntity.packageName + } + positionAndPackageMap[packages + (mSnapshotItemList.size - 1)] = mSnapshotItemList.size - 1 + game.gameLocation = GameEntity.GameLocation.INDEX + game.setEntryMap(DownloadManager.getInstance(getApplication()).getEntryMap(game.name)) + } + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt new file mode 100644 index 0000000000..c1f9890ad5 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayAdapter.kt @@ -0,0 +1,28 @@ +package com.gh.gamecenter.home.amway + +import android.content.Context +import android.view.ViewGroup +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.HomeAmwayItemBinding +import com.gh.gamecenter.entity.AmwayCommentEntity +import com.lightgame.adapter.BaseRecyclerAdapter + +class HomeAmwayAdapter(context: Context, + val dataList: List): BaseRecyclerAdapter(context){ + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeAmwayItemViewHolder { + val view = mLayoutInflater.inflate(R.layout.home_amway_item, parent, false) + return HomeAmwayItemViewHolder(HomeAmwayItemBinding.bind(view)) + } + + override fun getItemCount(): Int { + return dataList.size + } + + override fun onBindViewHolder(holder: HomeAmwayItemViewHolder, position: Int) { + holder.bindAmway(dataList[position]) + } + + fun checkResetData(update: List) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayItemViewHolder.kt index a9bc63081c..a133db275e 100644 --- a/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayItemViewHolder.kt @@ -2,10 +2,11 @@ package com.gh.gamecenter.home.amway import com.gh.base.BaseRecyclerViewHolder import com.gh.gamecenter.databinding.HomeAmwayItemBinding +import com.gh.gamecenter.entity.AmwayCommentEntity class HomeAmwayItemViewHolder(val binding: HomeAmwayItemBinding) : BaseRecyclerViewHolder(binding.root) { - fun bindAmway() { - + fun bindAmway(amway: AmwayCommentEntity) { + binding } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayListViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayListViewHolder.kt new file mode 100644 index 0000000000..8722984dd7 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/home/amway/HomeAmwayListViewHolder.kt @@ -0,0 +1,26 @@ +package com.gh.gamecenter.home.amway + +import androidx.recyclerview.widget.PagerSnapHelper +import androidx.recyclerview.widget.RecyclerView +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.view.FixLinearLayoutManager +import com.gh.gamecenter.databinding.HomeAmwayListBinding +import com.gh.gamecenter.entity.AmwayCommentEntity + +class HomeAmwayListViewHolder(val binding: HomeAmwayListBinding) : BaseRecyclerViewHolder(binding.root) { + + fun bindAmwayList(amwayList: List) { + val context = binding.recyclerView.context + var adapter = binding.recyclerView.adapter + if (adapter is HomeAmwayAdapter) { + adapter.checkResetData(amwayList) + return + } + adapter = HomeAmwayAdapter(context, amwayList) + binding.recyclerView.layoutManager = FixLinearLayoutManager(context, RecyclerView.HORIZONTAL, false) + binding.recyclerView.adapter = adapter + binding.recyclerView.onFlingListener = null + val snapHelper = PagerSnapHelper() + snapHelper.attachToRecyclerView(binding.recyclerView) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListItemViewHolder.kt index 196541cdfd..7aed79d551 100644 --- a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListItemViewHolder.kt @@ -1,29 +1,29 @@ package com.gh.gamecenter.home.slide -import android.annotation.SuppressLint +import android.widget.TextView import com.gh.base.BaseRecyclerViewHolder import com.gh.common.util.NumberUtils import com.gh.common.util.toColor import com.gh.gamecenter.R import com.gh.gamecenter.databinding.HomeSlideListItemBinding import com.gh.gamecenter.entity.HomeSlide -import com.gh.gamecenter.entity.TagStyleEntity class HomeSlideListItemViewHolder(val binding: HomeSlideListItemBinding) : BaseRecyclerViewHolder(binding.root) { - @SuppressLint("SetTextI18n") fun bindSlideListItem(homeSlide: HomeSlide) { binding.data = homeSlide + binding.root.findViewById(R.id.game_name).setTextColor(R.color.white.toColor()) val linkGame = homeSlide.linkGame ?: return - binding.data?.linkGame?.tagStyle = homeSlide.linkGame.homeSetting.tags as ArrayList + val homeTags = homeSlide.linkGame.homeSetting.tags + if (homeTags.isNotEmpty()) binding.data?.linkGame?.tagStyle = homeTags if (linkGame.commentCount < 10 || linkGame.star < 7.0) { - binding.ratingBackground.setBackgroundResource(R.drawable.home_visit_background) + binding.ratingBackground.setImageResource(R.drawable.home_visit_background) binding.ratingScore.setTextColor(R.color.theme.toColor()) binding.ratingScore.textSize = 10F - binding.ratingScore.text = NumberUtils.transSimpleCount(linkGame.visit) + "人\n想玩" + binding.ratingScore.text = (NumberUtils.transSimpleCount(linkGame.visit) + "人\n想玩") } else { - binding.ratingBackground.setBackgroundResource(R.drawable.home_rating_background) + binding.ratingBackground.setImageResource(R.drawable.home_rating_background) binding.ratingScore.setTextColor(R.color.white.toColor()) binding.ratingScore.textSize = 18F binding.ratingScore.text = linkGame.star.toString() diff --git a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt index 39712d35c7..86a4273b32 100644 --- a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt @@ -93,6 +93,8 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV view.background = DrawableView.getOvalSelectorStyle(R.color.text_D8D8D8, R.color.theme) if (i != 0) { params.leftMargin = margin + } else { + view.isChecked = true } view.layoutParams = params container.addView(view) diff --git a/app/src/main/res/layout/game_attach_item.xml b/app/src/main/res/layout/game_attach_item.xml index 35733cbe32..7dca594099 100644 --- a/app/src/main/res/layout/game_attach_item.xml +++ b/app/src/main/res/layout/game_attach_item.xml @@ -1,5 +1,6 @@ - + @@ -14,8 +15,6 @@ @@ -40,6 +39,7 @@ + + + + + @@ -23,6 +31,7 @@ @@ -114,6 +126,7 @@ android:id="@+id/user_badge" android:layout_width="10dp" android:layout_height="10dp" + imageIcon="@{data.comment.user.auth.icon}" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" /> @@ -125,6 +138,7 @@ android:layout_height="wrap_content" android:maxWidth="96dp" android:singleLine="true" + android:text="@{data.comment.user.name}" android:textColor="@color/text_666666" android:textSize="12sp" app:layout_constraintBottom_toBottomOf="@id/user_icon_container" diff --git a/app/src/main/res/layout/home_amway_list.xml b/app/src/main/res/layout/home_amway_list.xml new file mode 100644 index 0000000000..502b850887 --- /dev/null +++ b/app/src/main/res/layout/home_amway_list.xml @@ -0,0 +1,23 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/home_game_item.xml b/app/src/main/res/layout/home_game_item.xml index e540395f4c..ab68eb93ee 100644 --- a/app/src/main/res/layout/home_game_item.xml +++ b/app/src/main/res/layout/home_game_item.xml @@ -1,27 +1,31 @@ + + + + android:paddingBottom="8dp"> + android:background="@color/white" + android:descendantFocusability="blocksDescendants">