From bb3f888f88052b4db7dc79f0fb0163940b2d5f50 Mon Sep 17 00:00:00 2001
From: lyr <15622190878@163.com>
Date: Thu, 19 Nov 2020 09:59:33 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=89=E7=8E=AF?=
=?UTF-8?q?=E5=8A=A9=E6=89=8BV4.5.0-=E6=96=B0=E5=88=86=E7=B1=BB=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD=EF=BC=88=E5=89=8D=E7=AB=AF=EF=BC=89https://gitlab.ghz?=
=?UTF-8?q?s.com/pm/halo-app-issues/-/issues/1055?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/src/main/AndroidManifest.xml | 8 +
.../java/com/gh/common/util/DirectUtils.kt | 24 +-
.../com/gh/common/util/EntranceUtils.java | 4 +
.../com/gh/common/view/CatalogFilterView.kt | 320 ++++++++++++++++++
.../gh/gamecenter/catalog/CatalogActivity.kt | 33 ++
.../gh/gamecenter/catalog/CatalogAdapter.kt | 47 +++
.../gh/gamecenter/catalog/CatalogFragment.kt | 119 +++++++
.../gh/gamecenter/catalog/CatalogViewModel.kt | 47 +++
.../catalog/NewCatalogListActivity.kt | 33 ++
.../catalog/NewCatalogListAdapter.kt | 168 +++++++++
.../catalog/NewCatalogListFragment.kt | 154 +++++++++
.../catalog/NewCatalogListViewModel.kt | 82 +++++
.../catalog/SpecialCatalogAdapter.kt | 148 ++++++++
.../catalog/SpecialCatalogFragment.kt | 32 ++
.../catalog/SpecialCatalogItemData.kt | 10 +
.../catalog/SpecialCatalogSubjectAdapter.kt | 57 ++++
.../SpecialCatalogSubjectCollectionAdapter.kt | 61 ++++
.../catalog/SpecialCatalogViewModel.kt | 50 +++
.../gamecenter/catalog/SubCatalogAdapter.kt | 34 ++
.../gamecenter/catalog/SubCatalogFragment.kt | 84 +++++
.../gamecenter/catalog/SubCatalogViewModel.kt | 44 +++
.../category/CategoryDirectoryActivity.kt | 1 -
.../com/gh/gamecenter/entity/CatalogEntity.kt | 59 ++++
.../gh/gamecenter/game/GameFragmentAdapter.kt | 2 +
.../retrofit/service/ApiService.java | 22 +-
.../subject/SubjectListViewModel.kt | 5 +-
.../drawable-xhdpi/ic_filter_arrow_down.png | Bin 357 -> 0 bytes
.../res/drawable-xhdpi/ic_filter_arrow_up.png | Bin 337 -> 0 bytes
.../drawable-xxhdpi/ic_catalog_selected.png | Bin 0 -> 2071 bytes
.../drawable-xxhdpi/ic_filter_arrow_down.png | Bin 0 -> 986 bytes
.../drawable-xxhdpi/ic_filter_arrow_up.png | Bin 0 -> 1064 bytes
.../main/res/drawable-xxhdpi/ic_recommend.png | Bin 0 -> 2741 bytes
.../drawable-xxxhdpi/ic_catalog_selected.png | Bin 0 -> 2790 bytes
.../drawable-xxxhdpi/ic_filter_arrow_down.png | Bin 0 -> 1128 bytes
.../drawable-xxxhdpi/ic_filter_arrow_up.png | Bin 0 -> 1156 bytes
.../res/drawable-xxxhdpi/ic_recommend.png | Bin 0 -> 3751 bytes
.../main/res/drawable/bg_sub_catalog_item.xml | 6 +
app/src/main/res/drawable/bg_tag_text.xml | 12 +
.../main/res/layout/catalog_header_item.xml | 53 +++
.../main/res/layout/catalog_image_item.xml | 39 +++
app/src/main/res/layout/catalog_item.xml | 46 +++
.../catalog_subject_collection_item.xml | 10 +
.../catalog_subject_collection_list_item.xml | 16 +
.../res/layout/catalog_subject_game_item.xml | 42 +++
.../main/res/layout/catalog_subject_item.xml | 9 +
app/src/main/res/layout/fragment_catalog.xml | 39 +++
.../main/res/layout/fragment_catalog_list.xml | 54 +++
.../main/res/layout/fragment_sub_catalog.xml | 23 ++
app/src/main/res/layout/game_item.xml | 8 +-
app/src/main/res/layout/item_filter_size.xml | 18 +-
.../main/res/layout/layout_catalog_filter.xml | 69 ++++
.../main/res/layout/layout_filter_size.xml | 2 +-
app/src/main/res/layout/sub_catalog_item.xml | 61 ++++
app/src/main/res/values/colors.xml | 1 +
54 files changed, 2143 insertions(+), 13 deletions(-)
create mode 100644 app/src/main/java/com/gh/common/view/CatalogFilterView.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/CatalogActivity.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/CatalogAdapter.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/CatalogViewModel.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListActivity.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListFragment.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogFragment.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogItemData.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectAdapter.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectCollectionAdapter.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogViewModel.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/catalog/SubCatalogViewModel.kt
create mode 100644 app/src/main/java/com/gh/gamecenter/entity/CatalogEntity.kt
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_filter_arrow_down.png
delete mode 100644 app/src/main/res/drawable-xhdpi/ic_filter_arrow_up.png
create mode 100755 app/src/main/res/drawable-xxhdpi/ic_catalog_selected.png
create mode 100755 app/src/main/res/drawable-xxhdpi/ic_filter_arrow_down.png
create mode 100755 app/src/main/res/drawable-xxhdpi/ic_filter_arrow_up.png
create mode 100755 app/src/main/res/drawable-xxhdpi/ic_recommend.png
create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_catalog_selected.png
create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_filter_arrow_down.png
create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_filter_arrow_up.png
create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_recommend.png
create mode 100644 app/src/main/res/drawable/bg_sub_catalog_item.xml
create mode 100644 app/src/main/res/drawable/bg_tag_text.xml
create mode 100644 app/src/main/res/layout/catalog_header_item.xml
create mode 100644 app/src/main/res/layout/catalog_image_item.xml
create mode 100644 app/src/main/res/layout/catalog_item.xml
create mode 100644 app/src/main/res/layout/catalog_subject_collection_item.xml
create mode 100644 app/src/main/res/layout/catalog_subject_collection_list_item.xml
create mode 100644 app/src/main/res/layout/catalog_subject_game_item.xml
create mode 100644 app/src/main/res/layout/catalog_subject_item.xml
create mode 100644 app/src/main/res/layout/fragment_catalog.xml
create mode 100644 app/src/main/res/layout/fragment_catalog_list.xml
create mode 100644 app/src/main/res/layout/fragment_sub_catalog.xml
create mode 100644 app/src/main/res/layout/layout_catalog_filter.xml
create mode 100644 app/src/main/res/layout/sub_catalog_item.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e7bb670647..c094029afb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -591,6 +591,14 @@
android:name=".simulatorgame.SimulatorManagementActivity"
android:screenOrientation="portrait" />
+
+
+
+
directCategoryDirectory(context, linkEntity.link!!, linkEntity.text!!)
+ "catalog" -> directCatalog(context, linkEntity.link!!, linkEntity.text!!)
+
"block", "版块" -> {
if (linkEntity.link.isNullOrEmpty()) return
directToBlock(context,
@@ -889,6 +892,21 @@ object DirectUtils {
jumpActivity(context, bundle)
}
+ /**
+ * 跳转新分类
+ */
+ @JvmStatic
+ fun directCatalog(context: Context, catalogId: String, catalogTitle: String, entrance: String? = null, path: String? = "") {
+ if (catalogId.isEmpty()) return
+ val bundle = Bundle()
+ bundle.putString(KEY_TO, CategoryDirectoryActivity::class.java.name)
+ bundle.putString(KEY_CATALOG_ID, catalogId)
+ bundle.putString(KEY_CATALOG_TITLE, catalogTitle)
+ bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
+ bundle.putString(KEY_PATH, path)
+ jumpActivity(context, bundle)
+ }
+
/**
* 跳转到问题标签详情
*/
diff --git a/app/src/main/java/com/gh/common/util/EntranceUtils.java b/app/src/main/java/com/gh/common/util/EntranceUtils.java
index 6a7109b97a..3a391afd33 100644
--- a/app/src/main/java/com/gh/common/util/EntranceUtils.java
+++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java
@@ -215,6 +215,10 @@ public class EntranceUtils {
public static final String KEY_BBS_ID = "bbs_id";
public static final String KEY_DIAGNOSIS = "diagnosis";
public static final String KEY_SIMULATOR = "simulator";
+ public static final String KEY_CATALOG_ID = "catalogId";
+ public static final String KEY_PRIMARY_CATALOG_ID = "primaryCatalogId";
+ public static final String KEY_CATALOG_TITLE = "catalog_title";
+ public static final String KEY_CATALOG_INIT_TITLE = "catalog_init_title";
public static void jumpActivity(Context context, Bundle bundle) {
bundle.putBoolean(KEY_REQUIRE_REDIRECT, true);
diff --git a/app/src/main/java/com/gh/common/view/CatalogFilterView.kt b/app/src/main/java/com/gh/common/view/CatalogFilterView.kt
new file mode 100644
index 0000000000..431816db78
--- /dev/null
+++ b/app/src/main/java/com/gh/common/view/CatalogFilterView.kt
@@ -0,0 +1,320 @@
+package com.gh.common.view
+
+import android.content.Context
+import android.graphics.Color
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.PopupWindow
+import android.widget.TextView
+import androidx.core.content.ContextCompat
+import com.gh.common.util.toColor
+import com.gh.common.util.visibleIf
+import com.gh.gamecenter.R
+import com.gh.gamecenter.entity.CatalogSwitch
+import com.gh.gamecenter.entity.SubCatalogEntity
+import com.gh.gamecenter.entity.SubjectSettingEntity
+import com.google.android.flexbox.FlexboxLayout
+
+class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : LinearLayout(context, attrs, defStyleAttr) {
+
+ private var mTypeTv: TextView
+ private var mCatalogTv: TextView
+ private var mSizeTv: TextView
+ private var mTypeContainer: View
+ private var mCatalogContainer: View
+ private var mSizeContainer: View
+
+ private var mTypeFilterArray = ArrayList()
+ private var mCatalogFilterArray = ArrayList()
+ private var sizeFilterArray: ArrayList? = null
+
+ private var mOnCatalogFilterSetupListener: OnCatalogFilterSetupListener? = null
+
+ init {
+ View.inflate(context, R.layout.layout_catalog_filter, this)
+
+ mTypeTv = findViewById(R.id.type_tv)
+ mCatalogTv = findViewById(R.id.catalog_tv)
+ mSizeTv = findViewById(R.id.size_tv)
+ mTypeContainer = findViewById(R.id.container_type)
+ mCatalogContainer = findViewById(R.id.container_catalog)
+ mSizeContainer = findViewById(R.id.container_size)
+
+ mTypeContainer.setOnClickListener {
+ showSelectTypePopupWindow(this, mTypeTv, mTypeTv.text.toString())
+ }
+
+ mCatalogContainer.setOnClickListener {
+ showSelectCatalogPopupWindow(this, mCatalogTv, mCatalogTv.text.toString())
+ }
+
+ mSizeContainer.setOnClickListener {
+ showSelectSizePopupWindow(this, mSizeTv, mSizeTv.text.toString())
+ }
+
+// ratingTv.setOnClickListener {
+// mOnConfigFilterSetupListener?.onSetupSortType(SortType.RATING)
+// toggleHighlightedTextView(ratingTv, true)
+// toggleHighlightedTextView(newestTv, false)
+// toggleHighlightedTextView(recommendedTv, false)
+// }
+//
+// newestTv.setOnClickListener {
+// mOnConfigFilterSetupListener?.onSetupSortType(SortType.NEWEST)
+// toggleHighlightedTextView(ratingTv, false)
+// toggleHighlightedTextView(newestTv, true)
+// toggleHighlightedTextView(recommendedTv, false)
+// }
+//
+// recommendedTv.setOnClickListener {
+// mOnConfigFilterSetupListener?.onSetupSortType(SortType.RECOMMENDED)
+// toggleHighlightedTextView(ratingTv, false)
+// toggleHighlightedTextView(newestTv, false)
+// toggleHighlightedTextView(recommendedTv, true)
+// }
+ }
+
+ fun setTypeList(switch: CatalogSwitch) {
+ switch.run {
+ if ("on" == hotSort) mTypeFilterArray.add(SortType.RECOMMENDED)
+ if ("on" == newSort) mTypeFilterArray.add(SortType.NEWEST)
+ if ("on" == starSort) mTypeFilterArray.add(SortType.RATING)
+ }
+ if (mTypeFilterArray.isNotEmpty()) mTypeTv.text = mTypeFilterArray[0].value
+ }
+
+ fun setCatalogList(subCatalogList: List, initCatalogName: String) {
+ mCatalogFilterArray = ArrayList(subCatalogList)
+ mCatalogTv.text = initCatalogName
+ }
+
+ fun setOnConfigSetupListener(onCatalogFilterSetupListener: OnCatalogFilterSetupListener) {
+ mOnCatalogFilterSetupListener = onCatalogFilterSetupListener
+ }
+
+ private fun toggleHighlightedTextView(targetTextView: TextView, highlightIt: Boolean) {
+ if (highlightIt) {
+ targetTextView.background = ContextCompat.getDrawable(targetTextView.context, R.drawable.bg_tag_text)
+ targetTextView.setTextColor(Color.WHITE)
+ } else {
+ targetTextView.background = null
+ targetTextView.setTextColor(ContextCompat.getColor(targetTextView.context, R.color.text_757575))
+ }
+ }
+
+ private fun showSelectTypePopupWindow(containerView: View, typeTv: TextView, typeText: String) {
+ val drawableUp = ContextCompat.getDrawable(typeTv.context, R.drawable.ic_filter_arrow_up)
+ val drawableDown = ContextCompat.getDrawable(typeTv.context, R.drawable.ic_filter_arrow_down)
+ drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
+ drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
+
+ typeTv.setTextColor(R.color.theme_font.toColor())
+ typeTv.setCompoundDrawables(null, null, drawableUp, null)
+
+ val inflater = LayoutInflater.from(typeTv.context)
+ val layout = inflater.inflate(R.layout.layout_filter_size, null)
+ val popupWindow = PopupWindow(
+ layout,
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.WRAP_CONTENT)
+
+ val flexboxLayout = layout.findViewById(R.id.flexbox)
+ val backgroundView = layout.findViewById(R.id.background)
+
+ backgroundView.setOnClickListener {
+ popupWindow.dismiss()
+ }
+
+ for (type in mTypeFilterArray) {
+ val item = inflater.inflate(R.layout.item_filter_size, flexboxLayout, false)
+
+ // 单列 3 个,强行设置宽度为屏幕的 1/3
+ val width = typeTv.context.resources.displayMetrics.widthPixels / 3
+ val height = item.layoutParams.height
+
+ item.layoutParams = ViewGroup.LayoutParams(width, height)
+ flexboxLayout.addView(item)
+
+ val tv = item.findViewById(R.id.size_tv)
+ tv.text = type.value
+
+ toggleHighlightedTextView(tv, typeText == type.value)
+
+ tv.tag = type.value
+
+ item.setOnClickListener {
+ toggleHighlightedTextView(tv, true)
+ popupWindow.dismiss()
+ typeTv.text = type.value
+
+ mOnCatalogFilterSetupListener?.onSetupSortType(type)
+ }
+ }
+
+ popupWindow.setOnDismissListener {
+ typeTv.setTextColor(R.color.text_757575.toColor())
+ typeTv.setCompoundDrawables(null, null, drawableDown, null)
+ }
+
+ popupWindow.isTouchable = true
+ popupWindow.isFocusable = true
+ popupWindow.showAsDropDown(containerView, 0, 0)
+ }
+
+ private fun showSelectCatalogPopupWindow(containerView: View, catalogTv: TextView, catalogText: String) {
+ val drawableUp = ContextCompat.getDrawable(catalogTv.context, R.drawable.ic_filter_arrow_up)
+ val drawableDown = ContextCompat.getDrawable(catalogTv.context, R.drawable.ic_filter_arrow_down)
+ drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
+ drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
+
+ catalogTv.setTextColor(R.color.theme_font.toColor())
+ catalogTv.setCompoundDrawables(null, null, drawableUp, null)
+
+ val inflater = LayoutInflater.from(catalogTv.context)
+ val layout = inflater.inflate(R.layout.layout_filter_size, null)
+ val popupWindow = PopupWindow(
+ layout,
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.WRAP_CONTENT)
+
+ val flexboxLayout = layout.findViewById(R.id.flexbox)
+ val backgroundView = layout.findViewById(R.id.background)
+
+ backgroundView.setOnClickListener {
+ popupWindow.dismiss()
+ }
+
+ for (entity in mCatalogFilterArray) {
+ val item = inflater.inflate(R.layout.item_filter_size, flexboxLayout, false)
+
+ // 单列 3 个,强行设置宽度为屏幕的 1/3
+ val width = catalogTv.context.resources.displayMetrics.widthPixels / 3
+ val height = item.layoutParams.height
+
+ item.layoutParams = ViewGroup.LayoutParams(width, height)
+ flexboxLayout.addView(item)
+
+ val tv = item.findViewById(R.id.size_tv)
+ val iv = item.findViewById(R.id.recommend_iv)
+ tv.text = entity.name
+ iv.visibleIf(entity.recommended)
+
+ toggleHighlightedTextView(tv, catalogText == entity.name)
+
+ tv.tag = entity.name
+
+ item.setOnClickListener {
+ toggleHighlightedTextView(tv, true)
+ popupWindow.dismiss()
+ catalogTv.text = entity.name
+
+ mOnCatalogFilterSetupListener?.onSetupSortCatalog(entity)
+ }
+ }
+
+ popupWindow.setOnDismissListener {
+ catalogTv.setTextColor(R.color.text_757575.toColor())
+ catalogTv.setCompoundDrawables(null, null, drawableDown, null)
+ }
+
+ popupWindow.isTouchable = true
+ popupWindow.isFocusable = true
+ popupWindow.showAsDropDown(containerView, 0, 0)
+ }
+
+ private fun showSelectSizePopupWindow(containerView: View, sizeTv: TextView, sizeText: String) {
+ val drawableUp = ContextCompat.getDrawable(sizeTv.context, R.drawable.ic_filter_arrow_up)
+ val drawableDown = ContextCompat.getDrawable(sizeTv.context, R.drawable.ic_filter_arrow_down)
+ drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
+ drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
+
+ sizeTv.setTextColor(R.color.theme_font.toColor())
+ sizeTv.setCompoundDrawables(null, null, drawableUp, null)
+
+ val inflater = LayoutInflater.from(sizeTv.context)
+ val layout = inflater.inflate(R.layout.layout_filter_size, null)
+ val popupWindow = PopupWindow(
+ layout,
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.WRAP_CONTENT)
+
+ val flexboxLayout = layout.findViewById(R.id.flexbox)
+ val backgroundView = layout.findViewById(R.id.background)
+
+ sizeFilterArray = if (sizeFilterArray == null) {
+ getDefaultSizeFilterArray()
+ } else {
+ sizeFilterArray?.apply {
+ if (firstOrNull()?.text != "全部大小") {
+ add(0, SubjectSettingEntity.Size(min = -1, max = -1, text = "全部大小"))
+ }
+ }
+ }
+
+ backgroundView.setOnClickListener {
+ popupWindow.dismiss()
+ }
+
+ for (size in sizeFilterArray!!) {
+ val item = inflater.inflate(R.layout.item_filter_size, flexboxLayout, false)
+
+ // 单列 3 个,强行设置宽度为屏幕的 1/3
+ val width = sizeTv.context.resources.displayMetrics.widthPixels / 3
+ val height = item.layoutParams.height
+
+ item.layoutParams = ViewGroup.LayoutParams(width, height)
+ flexboxLayout.addView(item)
+
+ val tv = item.findViewById(R.id.size_tv)
+ tv.text = size.text
+
+ toggleHighlightedTextView(tv, sizeText == size.text)
+
+ tv.tag = size.text
+
+ item.setOnClickListener {
+ toggleHighlightedTextView(tv, true)
+ popupWindow.dismiss()
+ sizeTv.text = size.text
+
+ mOnCatalogFilterSetupListener?.onSetupSortSize(size)
+ }
+ }
+
+ popupWindow.setOnDismissListener {
+ sizeTv.setTextColor(R.color.text_757575.toColor())
+ sizeTv.setCompoundDrawables(null, null, drawableDown, null)
+ }
+
+ popupWindow.isTouchable = true
+ popupWindow.isFocusable = true
+ popupWindow.showAsDropDown(containerView, 0, 0)
+ }
+
+ private fun getDefaultSizeFilterArray(): ArrayList {
+ return arrayListOf().apply {
+ add(SubjectSettingEntity.Size(min = -1, max = -1, text = "全部大小"))
+ add(SubjectSettingEntity.Size(min = -1, max = 20, text = "20M以下"))
+ add(SubjectSettingEntity.Size(min = 20, max = 50, text = "20-50M"))
+ add(SubjectSettingEntity.Size(min = 50, max = 100, text = "50-100M"))
+ add(SubjectSettingEntity.Size(min = 100, max = 500, text = "100-500M"))
+ add(SubjectSettingEntity.Size(min = 500, max = -1, text = "500M以上"))
+ }
+ }
+
+ interface OnCatalogFilterSetupListener {
+ fun onSetupSortSize(sortSize: SubjectSettingEntity.Size)
+ fun onSetupSortType(sortType: SortType)
+ fun onSetupSortCatalog(sortCatalog: SubCatalogEntity)
+ }
+
+ enum class SortType(val value: String) {
+ RECOMMENDED("热门推荐"),
+ NEWEST("最新上线"),
+ RATING("最高评分")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/CatalogActivity.kt b/app/src/main/java/com/gh/gamecenter/catalog/CatalogActivity.kt
new file mode 100644
index 0000000000..e25e53dbb5
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/CatalogActivity.kt
@@ -0,0 +1,33 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.gh.common.util.EntranceUtils
+import com.gh.gamecenter.NormalActivity
+import com.gh.gamecenter.R
+
+class CatalogActivity : NormalActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setToolbarMenu(R.menu.menu_download)
+ }
+
+ override fun showDownloadMenu(): Boolean {
+ return true
+ }
+
+ override fun provideNormalIntent(): Intent {
+ return getTargetIntent(this, CatalogActivity::class.java, CatalogFragment::class.java)
+ }
+
+ companion object {
+ fun getIntent(context: Context, catalogId: String, catalogTitle: String): Intent {
+ val bundle = Bundle()
+ bundle.putString(EntranceUtils.KEY_CATALOG_ID, catalogId)
+ bundle.putString(EntranceUtils.KEY_CATALOG_TITLE, catalogTitle)
+ return getTargetIntent(context, CatalogActivity::class.java, CatalogFragment::class.java, bundle)
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/CatalogAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/CatalogAdapter.kt
new file mode 100644
index 0000000000..48e98e28a9
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/CatalogAdapter.kt
@@ -0,0 +1,47 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.view.View
+import android.view.ViewGroup
+import com.gh.base.BaseRecyclerViewHolder
+import com.gh.common.util.toColor
+import com.gh.gamecenter.R
+import com.gh.gamecenter.databinding.CatalogItemBinding
+import com.gh.gamecenter.entity.SubCatalogEntity
+import com.lightgame.adapter.BaseRecyclerAdapter
+
+class CatalogAdapter(context: Context, private val mFragment: CatalogFragment, private val mList: List) : BaseRecyclerAdapter(context) {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CatalogItemViewHolder {
+ val view = mLayoutInflater.inflate(R.layout.catalog_item, parent, false)
+ return CatalogItemViewHolder(CatalogItemBinding.bind(view))
+ }
+
+ override fun getItemCount(): Int {
+ return mList.size
+ }
+
+ override fun onBindViewHolder(holder: CatalogItemViewHolder, position: Int) {
+ holder.binding.run {
+ val catalogEntity = mList[position]
+ entity = catalogEntity
+ executePendingBindings()
+ if (catalogEntity.name == mFragment.selectedCatalogName) {
+ selectedTag.visibility = View.VISIBLE
+ root.setBackgroundColor(R.color.white.toColor())
+ } else {
+ selectedTag.visibility = View.GONE
+ root.setBackgroundColor(R.color.text_F5F5F5.toColor())
+ }
+ root.setOnClickListener {
+ if (catalogEntity.name != mFragment.selectedCatalogName) {
+ mFragment.selectedCatalogName = catalogEntity.name
+ mFragment.changeCatalog(position)
+ notifyDataSetChanged()
+ }
+ }
+ }
+ }
+
+ class CatalogItemViewHolder(val binding: CatalogItemBinding) : BaseRecyclerViewHolder(binding.root)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt b/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt
new file mode 100644
index 0000000000..196cbb03d2
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/CatalogFragment.kt
@@ -0,0 +1,119 @@
+package com.gh.gamecenter.catalog
+
+import android.os.Bundle
+import android.view.View
+import android.widget.LinearLayout
+import androidx.core.os.bundleOf
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.RecyclerView
+import com.gh.common.util.EntranceUtils
+import com.gh.common.util.viewModelProvider
+import com.gh.common.view.FixLinearLayoutManager
+import com.gh.gamecenter.R
+import com.gh.gamecenter.entity.CatalogEntity
+import com.gh.gamecenter.entity.SubCatalogEntity
+import com.gh.gamecenter.normal.NormalFragment
+import kotterknife.bindView
+
+class CatalogFragment : NormalFragment() {
+
+ private val mReuseLoading by bindView(R.id.reuse_ll_loading)
+ private val mReuseNoConnection by bindView(R.id.reuse_no_connection)
+ private val mReuseNoData by bindView(R.id.reuse_none_data)
+ private val mCatalogContainer by bindView(R.id.container_catalog)
+ private val mCatalogRv by bindView(R.id.rv_catalog)
+
+ private lateinit var mViewModel: CatalogViewModel
+ private lateinit var mEntity: CatalogEntity
+ private lateinit var mSpecialCatalogFragment: SpecialCatalogFragment
+ private lateinit var mSubCatalogFragment: SubCatalogFragment
+ private var mCatalogId: String = ""
+ private var mSelectedPosition = 0
+ var selectedCatalogName: String = ""
+
+ override fun getLayoutId() = R.layout.fragment_catalog
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ mCatalogId = arguments?.getString(EntranceUtils.KEY_CATALOG_ID) ?: ""
+ mViewModel = viewModelProvider(CatalogViewModel.Factory(mCatalogId))
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ setNavigationTitle(arguments?.getString(EntranceUtils.KEY_CATALOG_TITLE))
+ mViewModel.catalogs.observe(viewLifecycleOwner, Observer {
+ mReuseLoading.visibility = View.GONE
+ if (it != null) {
+ mReuseNoConnection.visibility = View.GONE
+ if (it.subCatalog.isNotEmpty()) {
+ mCatalogContainer.visibility = View.VISIBLE
+ mReuseNoData.visibility = View.GONE
+ mEntity = it
+ if (mEntity.hasSpecial) {
+ val specialEntity = SubCatalogEntity(name = "精选")
+ (mEntity.subCatalog as ArrayList).add(0, specialEntity)
+ }
+ initView()
+ } else {
+ mCatalogContainer.visibility = View.GONE
+ mReuseNoData.visibility = View.VISIBLE
+ }
+ } else {
+ mCatalogContainer.visibility = View.GONE
+ mReuseNoData.visibility = View.GONE
+ mReuseNoConnection.visibility = View.VISIBLE
+ mReuseNoConnection.setOnClickListener {
+ mReuseLoading.visibility = View.VISIBLE
+ mViewModel.getCatalogs()
+ }
+ }
+ })
+ }
+
+ private fun initView() {
+ mEntity.run {
+ if (subCatalog.isNotEmpty()) {
+ selectedCatalogName = subCatalog[0].name
+ mCatalogRv.layoutManager = FixLinearLayoutManager(requireContext())
+ mCatalogRv.adapter = CatalogAdapter(requireContext(), this@CatalogFragment, subCatalog)
+
+ if (hasSpecial) {
+ mSpecialCatalogFragment = childFragmentManager.findFragmentByTag(SpecialCatalogFragment::class.java.simpleName) as? SpecialCatalogFragment ?: SpecialCatalogFragment()
+ mSpecialCatalogFragment.arguments = bundleOf(EntranceUtils.KEY_CATALOG_ID to mEntity.id)
+ childFragmentManager.beginTransaction().replace(R.id.container_sub_catalog, mSpecialCatalogFragment, SpecialCatalogFragment::class.java.simpleName).commitAllowingStateLoss()
+ } else {
+ mSubCatalogFragment = childFragmentManager.findFragmentByTag(SubCatalogFragment::class.java.simpleName) as? SubCatalogFragment ?: SubCatalogFragment()
+ mSubCatalogFragment.arguments = bundleOf(EntranceUtils.KEY_CATALOG_ID to mEntity.id, EntranceUtils.KEY_PRIMARY_CATALOG_ID to subCatalog[0].id)
+ childFragmentManager.beginTransaction().replace(R.id.container_sub_catalog, mSubCatalogFragment, SubCatalogFragment::class.java.simpleName).commitAllowingStateLoss()
+ }
+ }
+
+ }
+ }
+
+ fun changeCatalog(position: Int) {
+ mEntity.run {
+ if (hasSpecial) {
+ if (mSelectedPosition == 0) {
+ mSubCatalogFragment = childFragmentManager.findFragmentByTag(SubCatalogFragment::class.java.simpleName) as? SubCatalogFragment ?: SubCatalogFragment()
+ mSubCatalogFragment.arguments = bundleOf(EntranceUtils.KEY_CATALOG_ID to mEntity.id, EntranceUtils.KEY_PRIMARY_CATALOG_ID to subCatalog[position].id)
+ childFragmentManager.beginTransaction().replace(R.id.container_sub_catalog, mSubCatalogFragment, SubCatalogFragment::class.java.simpleName).commitAllowingStateLoss()
+ } else {
+ if (position == 0) {
+ mSpecialCatalogFragment = childFragmentManager.findFragmentByTag(SpecialCatalogFragment::class.java.simpleName) as? SpecialCatalogFragment ?: SpecialCatalogFragment()
+ mSpecialCatalogFragment.arguments = bundleOf(EntranceUtils.KEY_CATALOG_ID to mEntity.id)
+ childFragmentManager.beginTransaction().replace(R.id.container_sub_catalog, mSpecialCatalogFragment, SpecialCatalogFragment::class.java.simpleName).commitAllowingStateLoss()
+ } else {
+ mSubCatalogFragment.changeSubCatalog(subCatalog[position].id)
+ }
+ }
+ } else {
+ mSubCatalogFragment.changeSubCatalog(subCatalog[position].id)
+ }
+ mSelectedPosition = position
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/CatalogViewModel.kt b/app/src/main/java/com/gh/gamecenter/catalog/CatalogViewModel.kt
new file mode 100644
index 0000000000..1db2a7bb14
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/CatalogViewModel.kt
@@ -0,0 +1,47 @@
+package com.gh.gamecenter.catalog
+
+import android.annotation.SuppressLint
+import android.app.Application
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.gh.gamecenter.entity.CatalogEntity
+import com.gh.gamecenter.retrofit.BiResponse
+import com.gh.gamecenter.retrofit.RetrofitManager
+import com.halo.assistant.HaloApp
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+
+class CatalogViewModel(application: Application, private val catalogId: String) : AndroidViewModel(application) {
+
+ private val api = RetrofitManager.getInstance(getApplication()).api
+ var catalogs = MutableLiveData()
+
+ init {
+ getCatalogs()
+ }
+
+ @SuppressLint("CheckResult")
+ fun getCatalogs() {
+ api.getCatalogs(catalogId)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(object : BiResponse() {
+ override fun onSuccess(data: CatalogEntity) {
+ catalogs.postValue(data)
+ }
+
+ override fun onFailure(exception: Exception) {
+ super.onFailure(exception)
+ catalogs.postValue(null)
+ }
+ })
+ }
+
+ class Factory(private val catalogId: String) : ViewModelProvider.NewInstanceFactory() {
+ override fun create(modelClass: Class): T {
+ return CatalogViewModel(HaloApp.getInstance().application, catalogId) as T
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListActivity.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListActivity.kt
new file mode 100644
index 0000000000..9f49914251
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListActivity.kt
@@ -0,0 +1,33 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import com.gh.common.util.EntranceUtils
+import com.gh.gamecenter.NormalActivity
+import com.gh.gamecenter.R
+import com.gh.gamecenter.entity.CatalogEntity
+
+class NewCatalogListActivity : NormalActivity() {
+
+ companion object {
+ fun getIntent(context: Context, catalogTitle: String, catalog: CatalogEntity, initTitle: String): Intent {
+ val bundle = Bundle()
+ bundle.putParcelable(EntranceUtils.KEY_DATA, catalog)
+ bundle.putString(EntranceUtils.KEY_NAME, catalog.name)
+ bundle.putString(EntranceUtils.KEY_CATALOG_TITLE, catalogTitle)
+ bundle.putString(EntranceUtils.KEY_CATALOG_INIT_TITLE, initTitle)
+ return getTargetIntent(context, NewCatalogListActivity::class.java, NewCatalogListFragment::class.java, bundle)
+ }
+ }
+
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setToolbarMenu(R.menu.menu_download)
+ }
+
+ override fun showDownloadMenu(): Boolean {
+ return true
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt
new file mode 100644
index 0000000000..d8223befa7
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt
@@ -0,0 +1,168 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.util.SparseArray
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.gh.common.constant.ItemViewType
+import com.gh.common.exposure.ExposureEvent
+import com.gh.common.exposure.ExposureSource
+import com.gh.common.exposure.ExposureType
+import com.gh.common.exposure.IExposable
+import com.gh.common.util.DownloadItemUtils
+import com.gh.common.util.StringUtils
+import com.gh.common.util.dip2px
+import com.gh.gamecenter.GameDetailActivity
+import com.gh.gamecenter.R
+import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
+import com.gh.gamecenter.adapter.viewholder.GameViewHolder
+import com.gh.gamecenter.baselist.ListAdapter
+import com.gh.gamecenter.baselist.LoadType
+import com.gh.gamecenter.databinding.GameItemBinding
+import com.gh.gamecenter.entity.GameEntity
+import com.gh.gamecenter.eventbus.EBDownloadStatus
+import com.gh.gamecenter.game.GameItemViewHolder
+import com.lightgame.download.DownloadEntity
+import java.util.*
+
+class NewCatalogListAdapter(context: Context,
+ private val mViewModel: NewCatalogListViewModel,
+ private val mEntrance: String?) : ListAdapter(context), IExposable {
+
+ private val mExposureEventSparseArray: SparseArray = SparseArray()
+
+ val positionAndPackageMap = HashMap()
+
+ override fun setListData(updateData: MutableList?) {
+ // 记录游戏位置
+ if (updateData != null) {
+ for (i in 0 until updateData.size) {
+ val gameEntity = updateData[i]
+ var packages = gameEntity.id
+ for (apkEntity in gameEntity.getApk()) {
+ packages += apkEntity.packageName
+ }
+ positionAndPackageMap[packages + i] = i
+ }
+ }
+ super.setListData(updateData)
+ }
+
+ fun clearPositionAndPackageMap() {
+ positionAndPackageMap.clear()
+ }
+
+ override fun areItemsTheSame(oldItem: GameEntity?, newItem: GameEntity?): Boolean {
+ return oldItem?.id == newItem?.id
+ }
+
+ override fun getItemViewType(position: Int): Int {
+ if (position == itemCount - 1) {
+ return ItemViewType.ITEM_FOOTER
+ }
+ return ItemViewType.GAME_NORMAL
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ return when (viewType) {
+ ItemViewType.GAME_NORMAL -> {
+ GameItemViewHolder(GameItemBinding.bind(mLayoutInflater.inflate(R.layout.game_item, parent, false)))
+ }
+ else -> {
+ FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false))
+ }
+ }
+ }
+
+ override fun getItemCount(): Int {
+ return if (mEntityList == null || mEntityList.isEmpty()) return 0 else mEntityList.size + 1
+ }
+
+ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+ if (holder is GameItemViewHolder) {
+ val gameEntity = mEntityList[position]
+
+ holder.binding.game = gameEntity
+ holder.initServerType(gameEntity)
+ holder.binding.hideSize = true
+ holder.binding.executePendingBindings()
+
+ val padTop = if (position == 0) 16F.dip2px() else 8F.dip2px()
+ holder.itemView.setPadding(16F.dip2px(), padTop, 16F.dip2px(), 8F.dip2px())
+
+ gameEntity.sequence = position + 1
+
+ val sortType = mViewModel.sortType.value
+ val toolbarTitle = mViewModel.title
+ val categoryTitle = mViewModel.categoryTitle
+ val selectedCatalogName = mViewModel.selectedCatalog.name
+
+ val exposureSources = ArrayList()
+ exposureSources.add(ExposureSource(categoryTitle, selectedCatalogName))
+ exposureSources.add(ExposureSource("二级分类", "$selectedCatalogName+$sortType"))
+ gameEntity.sequence = position + 1
+
+ val event = ExposureEvent.createEvent(gameEntity, exposureSources, null, ExposureType.EXPOSURE)
+ mExposureEventSparseArray.put(position, event)
+
+ holder.itemView.setOnClickListener {
+ GameDetailActivity.startGameDetailActivity(
+ mContext,
+ gameEntity,
+ StringUtils.buildString(mEntrance, "+(", toolbarTitle, ":列表[", selectedCatalogName, "=", sortType, "=", (position + 1).toString(), "])"),
+ event)
+ }
+ DownloadItemUtils.setOnClickListener(mContext,
+ holder.binding.downloadBtn,
+ gameEntity,
+ position,
+ this,
+ StringUtils.buildString(StringUtils.buildString(mEntrance, "+(", toolbarTitle, ":列表[", selectedCatalogName, "=", sortType, "=", (position + 1).toString(), "])")),
+ StringUtils.buildString(selectedCatalogName, ":", gameEntity.name),
+ event)
+
+ DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(holder.binding), true, "star&brief")
+ } else if (holder is FooterViewHolder) {
+ holder.initItemPadding()
+ holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint)
+ holder.itemView.setOnClickListener {
+ if (mIsNetworkError) {
+ mViewModel.load(LoadType.RETRY)
+ }
+ }
+ }
+ }
+
+ fun notifyItemByDownload(download: DownloadEntity) {
+ for (key in positionAndPackageMap.keys) {
+ if (key.contains(download.packageName) && key.contains(download.gameId)) {
+ val position = positionAndPackageMap[key]
+ if (position != null && mEntityList != null && position < mEntityList.size) {
+ mEntityList[position].getEntryMap()[download.platform] = download
+ notifyItemChanged(position)
+ }
+ }
+ }
+ }
+
+ fun notifyItemAndRemoveDownload(status: EBDownloadStatus) {
+ for (key in positionAndPackageMap.keys) {
+ if (key.contains(status.packageName) && key.contains(status.gameId)) {
+ val position = positionAndPackageMap[key]
+ if (position != null && mEntityList != null && position < mEntityList.size) {
+ mEntityList[position].getEntryMap().remove(status.platform)
+ notifyItemChanged(position)
+ }
+ }
+ }
+ }
+
+ override fun getEventByPosition(pos: Int): ExposureEvent? {
+ return mExposureEventSparseArray.get(pos)
+ }
+
+ override fun getEventListByPosition(pos: Int): List? {
+ return null
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListFragment.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListFragment.kt
new file mode 100644
index 0000000000..08bb2be07d
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListFragment.kt
@@ -0,0 +1,154 @@
+package com.gh.gamecenter.catalog
+
+import android.os.Bundle
+import android.view.View
+import com.ethanhua.skeleton.Skeleton
+import com.gh.common.constant.Constants
+import com.gh.common.exposure.ExposureListener
+import com.gh.common.util.*
+import com.gh.common.view.CatalogFilterView
+import com.gh.common.xapk.XapkInstaller
+import com.gh.common.xapk.XapkUnzipStatus
+import com.gh.download.DownloadManager
+import com.gh.gamecenter.R
+import com.gh.gamecenter.baselist.ListFragment
+import com.gh.gamecenter.entity.*
+import com.gh.gamecenter.eventbus.EBDownloadStatus
+import com.gh.gamecenter.eventbus.EBPackage
+import com.lightgame.download.DataWatcher
+import com.lightgame.download.DownloadEntity
+import kotterknife.bindView
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+class NewCatalogListFragment : ListFragment() {
+
+ private val mSkeletonView by bindView(R.id.list_skeleton)
+ private val mFilterView by bindView(R.id.filter_container)
+
+ private var mPrimeCatalog: CatalogEntity? = null
+ private var mSubCatalogList = arrayListOf()
+ private var mInitCatalogName = ""
+
+ private var mAdapter: NewCatalogListAdapter? = null
+ private val mDataWatcher = object : DataWatcher() {
+ override fun onDataChanged(downloadEntity: DownloadEntity) {
+ mAdapter?.notifyItemByDownload(downloadEntity)
+
+ if (downloadEntity.meta[XapkInstaller.XAPK_UNZIP_STATUS] == XapkUnzipStatus.FAILURE.name) {
+ showUnzipFailureDialog(downloadEntity)
+ }
+ }
+ }
+
+ private lateinit var mExposureListener: ExposureListener
+ private lateinit var mViewModel: NewCatalogListViewModel
+
+ override fun getLayoutId() = R.layout.fragment_catalog_list
+
+ override fun provideListViewModel() = viewModelProvider()
+
+ override fun provideListAdapter() = mAdapter ?: NewCatalogListAdapter(requireContext(), mViewModel, mEntrance).apply { mAdapter = this }
+
+ override fun getItemDecoration() = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ mViewModel = provideListViewModel()
+
+ mViewModel.title = arguments?.getString(EntranceUtils.KEY_NAME) ?: ""
+ mViewModel.categoryTitle = arguments?.getString(EntranceUtils.KEY_CATALOG_TITLE) ?: ""
+ mEntrance = arguments?.getString(EntranceUtils.KEY_ENTRANCE) ?: Constants.ENTRANCE_UNKNOWN
+ mPrimeCatalog = arguments?.getParcelable(EntranceUtils.KEY_DATA)
+ mSubCatalogList = mPrimeCatalog?.subCatalog as ArrayList
+
+ mInitCatalogName = arguments?.getString(EntranceUtils.KEY_CATALOG_INIT_TITLE) ?: ""
+
+ mViewModel.selectedCatalog = mSubCatalogList.find { entity -> entity.name == mInitCatalogName }
+ ?: SubCatalogEntity()
+
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ setNavigationTitle(mViewModel.title)
+
+ initFilterView()
+
+ mViewModel.refresh.observeNonNull(this) { onRefresh() }
+
+ mExposureListener = ExposureListener(this, mAdapter!!)
+ mListRv.addOnScrollListener(mExposureListener)
+
+ mSkeletonScreen = Skeleton.bind(mSkeletonView).shimmer(false).load(R.layout.fragment_subject_skeleton).show()
+ }
+
+ private fun initFilterView() {
+ mFilterView.run {
+ visibility = View.VISIBLE
+ setTypeList(mPrimeCatalog?.switch ?: CatalogSwitch())
+ setCatalogList(mSubCatalogList, mInitCatalogName)
+ setOnConfigSetupListener(object : CatalogFilterView.OnCatalogFilterSetupListener {
+ override fun onSetupSortSize(sortSize: SubjectSettingEntity.Size) {
+ mViewModel.updateSortConfig(sortSize = sortSize)
+ }
+
+ override fun onSetupSortType(sortType: CatalogFilterView.SortType) {
+ mViewModel.updateSortConfig(sortType = sortType)
+ }
+
+ override fun onSetupSortCatalog(sortCatalog: SubCatalogEntity) {
+ mViewModel.updateSortConfig(sortCatalog = sortCatalog)
+ }
+ })
+ }
+
+ }
+
+ override fun onResume() {
+ if (isEverPause && mAdapter != null) mAdapter?.notifyDataSetChanged()
+ super.onResume()
+ DownloadManager.getInstance(context).addObserver(mDataWatcher)
+ }
+
+ override fun onPause() {
+ super.onPause()
+ DownloadManager.getInstance(context).removeObserver(mDataWatcher)
+ }
+
+ override fun onRefresh() {
+ mAdapter?.clearPositionAndPackageMap()
+
+ super.onRefresh()
+ }
+
+ // 下载被删除事件
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun onEventMainThread(status: EBDownloadStatus) {
+ if ("delete" == status.status) {
+ mAdapter?.notifyItemAndRemoveDownload(status)
+ }
+ }
+
+ // 安装/卸载 事件
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ fun onEventMainThread(busFour: EBPackage) {
+ if ("安装" == busFour.type || "卸载" == busFour.type) {
+ mAdapter?.notifyDataSetChanged()
+ }
+ }
+
+ fun showUnzipFailureDialog(downloadEntity: DownloadEntity) {
+ val data = mAdapter?.positionAndPackageMap ?: return
+ for (gameAndPosition in data) {
+ if (gameAndPosition.key.contains(downloadEntity.packageName)) {
+ val targetView = mLayoutManager.findViewByPosition(gameAndPosition.value)
+ if (targetView != null) {
+ DialogUtils.showUnzipFailureDialog(requireContext(), downloadEntity)
+ return
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt
new file mode 100644
index 0000000000..65971afac2
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt
@@ -0,0 +1,82 @@
+package com.gh.gamecenter.catalog
+
+import android.app.Application
+import androidx.lifecycle.MutableLiveData
+import com.gh.common.util.UrlFilterUtils
+import com.gh.common.view.CatalogFilterView
+import com.gh.gamecenter.baselist.ListViewModel
+import com.gh.gamecenter.entity.GameEntity
+import com.gh.gamecenter.entity.SubCatalogEntity
+import com.gh.gamecenter.entity.SubjectSettingEntity
+import com.gh.gamecenter.retrofit.RetrofitManager
+import io.reactivex.Observable
+import io.reactivex.Single
+
+class NewCatalogListViewModel(application: Application) : ListViewModel(application) {
+
+ var title = "" // 显示在 Toolbar 的标题
+ var categoryTitle = "" // 跳转进来的分类的标题
+
+ val refresh = MutableLiveData()
+
+ var selectedCatalog = SubCatalogEntity()
+ var sortType = CatalogFilterView.SortType.RECOMMENDED
+ private var mSortSize = SubjectSettingEntity.Size()
+ private val api = RetrofitManager.getInstance(getApplication()).api
+
+ override fun provideDataObservable(page: Int): Observable>? = null
+
+ override fun provideDataSingle(page: Int): Single> {
+ return if (selectedCatalog.link.type == "column") {
+ api.getColumn(selectedCatalog.link.link, getSortType(), getSortSize(), page)
+ } else {
+ api.getGamesWithSpecificTag(getSortSize(), getSortType(), page)
+ }
+ }
+
+ override fun mergeResultLiveData() {
+ mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) }
+ }
+
+ fun updateSortConfig(sortSize: SubjectSettingEntity.Size? = null,
+ sortType: CatalogFilterView.SortType? = null,
+ sortCatalog: SubCatalogEntity? = null) {
+ when {
+ sortSize != null && sortSize != mSortSize -> {
+ mSortSize = sortSize
+ refresh.postValue(true)
+ }
+
+ sortType != null && sortType != this.sortType -> {
+ this.sortType = sortType
+ refresh.postValue(true)
+ }
+
+ sortCatalog != null && sortCatalog != selectedCatalog -> {
+ selectedCatalog = sortCatalog
+ refresh.postValue(true)
+ }
+ }
+ }
+
+ private fun getSortSize(): String? {
+ return if (selectedCatalog.link.type == "column") {
+ UrlFilterUtils.getFilterQuery(
+ "min_size", mSortSize.min.toString(),
+ "max_size", mSortSize.max.toString())
+ } else {
+ UrlFilterUtils.getFilterQuery(
+ "tag_id", selectedCatalog.link.link,
+ "min_size", mSortSize.min.toString(),
+ "max_size", mSortSize.max.toString())
+ }
+ }
+
+ private fun getSortType(): String? {
+ return when (sortType) {
+ CatalogFilterView.SortType.RECOMMENDED -> "download:-1"
+ CatalogFilterView.SortType.NEWEST -> "publish:-1"
+ CatalogFilterView.SortType.RATING -> "star:-1"
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt
new file mode 100644
index 0000000000..5c828abd79
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt
@@ -0,0 +1,148 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.view.View
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.gh.base.BaseRecyclerViewHolder
+import com.gh.common.constant.ItemViewType
+import com.gh.common.util.DirectUtils
+import com.gh.gamecenter.R
+import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
+import com.gh.gamecenter.baselist.ListAdapter
+import com.gh.gamecenter.databinding.CatalogHeaderItemBinding
+import com.gh.gamecenter.databinding.CatalogImageItemBinding
+import com.gh.gamecenter.databinding.CatalogSubjectCollectionItemBinding
+import com.gh.gamecenter.databinding.CatalogSubjectItemBinding
+import com.gh.gamecenter.entity.GameEntity
+import com.gh.gamecenter.subject.SubjectActivity.Companion.startSubjectActivity
+
+class SpecialCatalogAdapter(context: Context) : ListAdapter(context) {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
+ val view: View
+ return when (viewType) {
+ ItemViewType.ITEM_FOOTER -> {
+ view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)
+ FooterViewHolder(view)
+ }
+
+ TYPE_HEADER -> CatalogHeaderItemHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.catalog_header_item, parent, false))
+
+ TYPE_BIG_IMAGE -> CatalogImageItemHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.catalog_image_item, parent, false))
+
+ TYPE_SUBJECT -> CatalogSubjectItemHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.catalog_subject_item, parent, false))
+
+ TYPE_SUBJECT_COLLECTION -> CatalogSubjectCollectionItemHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.catalog_subject_collection_item, parent, false))
+
+ else -> throw NullPointerException()
+ }
+ }
+
+ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
+ when (holder) {
+ is CatalogImageItemHolder -> {
+ val imageEntity = mEntityList[position].bigImage!!
+ holder.binding.run {
+ entity = imageEntity.image
+ root.setOnClickListener { DirectUtils.directToLinkPage(mContext, imageEntity.link, "新分类-精选分类", "图片") }
+ }
+ }
+
+ is CatalogHeaderItemHolder -> {
+ val entity = mEntityList[position].header!!
+ val specialLink = entity.link
+ holder.binding.run {
+ link = specialLink
+ headMore.setOnClickListener {
+ if (entity.type == "专题合集") {
+ DirectUtils.directToColumnCollection(mContext, specialLink.link ?: "", -1, "(游戏-专题:" + specialLink.text + "-全部)")
+ } else {
+ startSubjectActivity(mContext, specialLink.link, specialLink.text, false, "(游戏-专题:" + specialLink.text + "-全部)")
+ }
+ }
+ }
+ }
+
+ is CatalogSubjectItemHolder -> {
+ val subject = mEntityList[position].subject!!
+ holder.bindSubject(subject.link.data)
+ }
+
+ is CatalogSubjectCollectionItemHolder -> {
+ val subjectCollection = mEntityList[position].subjectCollection!!
+ holder.bindSubjectCollection(subjectCollection.link.data)
+ }
+
+ is FooterViewHolder -> {
+ holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint)
+ }
+ }
+ }
+
+ override fun getItemViewType(position: Int): Int {
+ return if (position == itemCount - 1) {
+ ItemViewType.ITEM_FOOTER
+ } else {
+ val item = mEntityList[position]
+ when {
+ item.header != null -> TYPE_HEADER
+ item.bigImage != null -> TYPE_BIG_IMAGE
+ item.subject != null -> TYPE_SUBJECT
+ item.subjectCollection != null -> TYPE_SUBJECT_COLLECTION
+ else -> TYPE_SUBJECT_COLLECTION
+ }
+ }
+ }
+
+ override fun getItemCount() = if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT
+
+ class CatalogImageItemHolder(val binding: CatalogImageItemBinding) : BaseRecyclerViewHolder(binding.root)
+
+ class CatalogHeaderItemHolder(val binding: CatalogHeaderItemBinding) : BaseRecyclerViewHolder(binding.root)
+
+ class CatalogSubjectItemHolder(val binding: CatalogSubjectItemBinding) : BaseRecyclerViewHolder(binding.root) {
+
+ fun bindSubject(gameList: List) {
+ binding.gameList.run {
+ var subjectAdapter = adapter
+ if (subjectAdapter is SpecialCatalogSubjectAdapter) {
+ subjectAdapter.checkResetData(gameList)
+ return
+ }
+ subjectAdapter = SpecialCatalogSubjectAdapter(context, gameList)
+ layoutManager = GridLayoutManager(context, 3)
+ adapter = subjectAdapter
+ }
+ }
+ }
+
+ class CatalogSubjectCollectionItemHolder(val binding: CatalogSubjectCollectionItemBinding) : BaseRecyclerViewHolder(binding.root) {
+
+ fun bindSubjectCollection(subjectCollection: List) {
+ binding.subjectCollectionList.run {
+ var collectionAdapter = adapter
+ if (collectionAdapter is SpecialCatalogSubjectCollectionAdapter) {
+ collectionAdapter.checkResetData(subjectCollection)
+ return
+ }
+ collectionAdapter = SpecialCatalogSubjectCollectionAdapter(context, subjectCollection)
+ layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
+ adapter = collectionAdapter
+ }
+ }
+ }
+
+ companion object {
+ private const val TYPE_HEADER = 900
+
+ private const val TYPE_BIG_IMAGE = 901
+
+ private const val TYPE_SUBJECT = 902
+
+ private const val TYPE_SUBJECT_COLLECTION = 903
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogFragment.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogFragment.kt
new file mode 100644
index 0000000000..40a28cd5b5
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogFragment.kt
@@ -0,0 +1,32 @@
+package com.gh.gamecenter.catalog
+
+import android.graphics.Color
+import android.os.Bundle
+import android.view.View
+import com.gh.common.util.*
+import com.gh.gamecenter.baselist.ListFragment
+
+class SpecialCatalogFragment : ListFragment() {
+
+ private var mCatalogId = ""
+
+ private var mAdapter: SpecialCatalogAdapter? = null
+
+ override fun provideListViewModel() = viewModelProvider(SpecialCatalogViewModel.Factory(mCatalogId))
+
+ override fun provideListAdapter() = mAdapter ?: SpecialCatalogAdapter(requireContext()).apply { mAdapter = this }
+
+ override fun getItemDecoration() = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ mCatalogId = arguments?.getString(EntranceUtils.KEY_CATALOG_ID) ?: ""
+
+ super.onCreate(savedInstanceState)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ mListRv.setBackgroundColor(Color.WHITE)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogItemData.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogItemData.kt
new file mode 100644
index 0000000000..3f39494efc
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogItemData.kt
@@ -0,0 +1,10 @@
+package com.gh.gamecenter.catalog
+
+import com.gh.gamecenter.entity.SpecialCatalogEntity
+
+data class SpecialCatalogItemData(
+ val header: SpecialCatalogEntity? = null,
+ val bigImage: SpecialCatalogEntity? = null,
+ val subject: SpecialCatalogEntity? = null,
+ val subjectCollection: SpecialCatalogEntity? = null
+)
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectAdapter.kt
new file mode 100644
index 0000000000..d7a99b660d
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectAdapter.kt
@@ -0,0 +1,57 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import com.gh.base.BaseRecyclerViewHolder
+import com.gh.gamecenter.GameDetailActivity
+import com.gh.gamecenter.R
+import com.gh.gamecenter.databinding.CatalogSubjectGameItemBinding
+import com.gh.gamecenter.entity.GameEntity
+import com.lightgame.adapter.BaseRecyclerAdapter
+
+class SpecialCatalogSubjectAdapter(context: Context, private var mList: List) : BaseRecyclerAdapter(context) {
+
+ private val mEntrance = "精选分类"
+ private var countAndKey: Pair? = null
+
+ init {
+ var dataIds = ""
+ mList.forEach {
+ dataIds += it.id
+ }
+ if (dataIds.isNotEmpty()) countAndKey = Pair(mList.size, dataIds)
+ }
+
+ override fun getItemCount() = mList.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
+ = CatalogSubjectGameItemViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.catalog_subject_game_item, parent, false))
+
+ override fun onBindViewHolder(holder: CatalogSubjectGameItemViewHolder, position: Int) {
+ holder.binding.run {
+ val entity = mList[position]
+ game = entity
+ root.setOnClickListener {
+ GameDetailActivity.startGameDetailActivity(mContext, entity, "(${mEntrance})")
+ }
+ }
+ }
+
+ fun checkResetData(update: List) {
+ var dataIds = ""
+ mList.forEach { dataIds += it.id }
+
+ mList = update
+ if (countAndKey?.first == update.size && countAndKey?.second != dataIds) { // 数量不变,内容发生改变
+ notifyItemRangeChanged(0, itemCount)
+ } else if (countAndKey?.first != update.size) { // 数量发生改变
+ notifyDataSetChanged()
+ }
+
+ // 重新刷新数据标识
+ countAndKey = Pair(update.size, dataIds)
+ }
+
+ class CatalogSubjectGameItemViewHolder(val binding: CatalogSubjectGameItemBinding) : BaseRecyclerViewHolder(binding.root)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectCollectionAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectCollectionAdapter.kt
new file mode 100644
index 0000000000..c85d2e7ba7
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogSubjectCollectionAdapter.kt
@@ -0,0 +1,61 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.view.ViewGroup
+import androidx.databinding.DataBindingUtil
+import com.gh.base.BaseRecyclerViewHolder
+import com.gh.common.util.DirectUtils
+import com.gh.common.util.ImageUtils
+import com.gh.common.util.dip2px
+import com.gh.gamecenter.R
+import com.gh.gamecenter.databinding.CatalogSubjectCollectionListItemBinding
+import com.gh.gamecenter.entity.GameEntity
+import com.gh.gamecenter.entity.LinkEntity
+import com.lightgame.adapter.BaseRecyclerAdapter
+
+class SpecialCatalogSubjectCollectionAdapter(context: Context, private var mList: List) : BaseRecyclerAdapter(context) {
+
+ private var countAndKey: Pair? = null
+
+ init {
+ var dataIds = ""
+ mList.forEach {
+ dataIds += it.id
+ }
+ if (dataIds.isNotEmpty()) countAndKey = Pair(mList.size, dataIds)
+ }
+
+ override fun getItemCount() = mList.size
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
+ = CatalogSubjectCollectionListItemViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.catalog_subject_collection_list_item, parent, false))
+
+
+ override fun onBindViewHolder(holder: CatalogSubjectCollectionListItemViewHolder, position: Int) {
+ holder.binding.run {
+ root.layoutParams = (root.layoutParams as ViewGroup.MarginLayoutParams).apply {
+ leftMargin = if (position == 0) 16F.dip2px() else 0
+ }
+ val entity = mList[position]
+ ImageUtils.display(subjectCollectionImage, entity.image)
+ root.setOnClickListener { DirectUtils.directToLinkPage(mContext, LinkEntity(link = entity.link, type = entity.type), "精选分类", "专题合集") }
+ }
+ }
+
+ fun checkResetData(update: List) {
+ var dataIds = ""
+ mList.forEach { dataIds += it.id }
+
+ mList = update
+ if (countAndKey?.first == update.size && countAndKey?.second != dataIds) { // 数量不变,内容发生改变
+ notifyItemRangeChanged(0, itemCount)
+ } else if (countAndKey?.first != update.size) { // 数量发生改变
+ notifyDataSetChanged()
+ }
+
+ // 重新刷新数据标识
+ countAndKey = Pair(update.size, dataIds)
+ }
+
+ class CatalogSubjectCollectionListItemViewHolder(val binding: CatalogSubjectCollectionListItemBinding) : BaseRecyclerViewHolder(binding.root)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogViewModel.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogViewModel.kt
new file mode 100644
index 0000000000..fcb1147d03
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogViewModel.kt
@@ -0,0 +1,50 @@
+package com.gh.gamecenter.catalog
+
+import android.app.Application
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.gh.gamecenter.baselist.ListViewModel
+import com.gh.gamecenter.entity.SpecialCatalogEntity
+import com.gh.gamecenter.retrofit.RetrofitManager
+import com.halo.assistant.HaloApp
+import io.reactivex.Observable
+import io.reactivex.Single
+
+class SpecialCatalogViewModel(application: Application, private val catalogId: String): ListViewModel(application) {
+
+ override fun provideDataObservable(page: Int): Observable>? = null
+
+ override fun provideDataSingle(page: Int): Single> {
+ return RetrofitManager.getInstance(getApplication())
+ .sensitiveApi
+ .getSpecialCatalogs(catalogId, page)
+ }
+
+ override fun mergeResultLiveData() {
+ mResultLiveData.addSource(mListLiveData) { list ->
+ val itemDataList = arrayListOf()
+ list.forEach {
+ when (it.type) {
+ "图片" -> itemDataList.add(SpecialCatalogItemData(bigImage = it))
+
+ "专题" -> {
+ itemDataList.add(SpecialCatalogItemData(header = it))
+ itemDataList.add(SpecialCatalogItemData(subject = it))
+ }
+
+ "专题合集" -> {
+ itemDataList.add(SpecialCatalogItemData(header = it))
+ itemDataList.add(SpecialCatalogItemData(subjectCollection = it))
+ }
+ }
+ }
+ mResultLiveData.postValue(itemDataList)
+ }
+ }
+
+ class Factory(private val catalogId: String) : ViewModelProvider.NewInstanceFactory() {
+ override fun create(modelClass: Class): T {
+ return SpecialCatalogViewModel(HaloApp.getInstance().application, catalogId) as T
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
new file mode 100644
index 0000000000..41a7c2ed3a
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
@@ -0,0 +1,34 @@
+package com.gh.gamecenter.catalog
+
+import android.content.Context
+import android.view.ViewGroup
+import com.gh.base.BaseRecyclerViewHolder
+import com.gh.gamecenter.R
+import com.gh.gamecenter.databinding.SubCatalogItemBinding
+import com.gh.gamecenter.entity.CatalogEntity
+import com.gh.gamecenter.entity.SubCatalogEntity
+import com.lightgame.adapter.BaseRecyclerAdapter
+
+class SubCatalogAdapter(context: Context, private val mPrimaryCatalog: CatalogEntity, private var mList: List) : BaseRecyclerAdapter(context) {
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SubCatalogItemViewHolder {
+ val view = mLayoutInflater.inflate(R.layout.sub_catalog_item, parent, false)
+ return SubCatalogItemViewHolder(SubCatalogItemBinding.bind(view))
+ }
+
+ override fun getItemCount(): Int {
+ return mList.size
+ }
+
+ override fun onBindViewHolder(holder: SubCatalogItemViewHolder, position: Int) {
+ holder.binding.run {
+ val catalogEntity = mList[position]
+ entity = catalogEntity
+ root.setOnClickListener {
+ root.context.startActivity(NewCatalogListActivity.getIntent(mContext, catalogEntity.name, mPrimaryCatalog, catalogEntity.name))
+ }
+ }
+ }
+
+ class SubCatalogItemViewHolder(val binding: SubCatalogItemBinding) : BaseRecyclerViewHolder(binding.root)
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
new file mode 100644
index 0000000000..42b4c21163
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogFragment.kt
@@ -0,0 +1,84 @@
+package com.gh.gamecenter.catalog
+
+import android.os.Bundle
+import android.view.View
+import android.widget.LinearLayout
+import androidx.lifecycle.Observer
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import com.gh.common.util.EntranceUtils
+import com.gh.common.util.viewModelProvider
+import com.gh.gamecenter.R
+import com.gh.gamecenter.entity.CatalogEntity
+import com.gh.gamecenter.normal.NormalFragment
+import kotterknife.bindView
+
+class SubCatalogFragment : NormalFragment() {
+
+ private val mReuseLoading by bindView(R.id.reuse_ll_loading)
+ private val mReuseNoConnection by bindView(R.id.reuse_no_connection)
+ private val mReuseNoData by bindView(R.id.reuse_none_data)
+ private val mSubCatalogRv by bindView(R.id.rv_sub_catalog)
+
+ private lateinit var mViewModel: SubCatalogViewModel
+ private lateinit var mSubCatalogAdapter: SubCatalogAdapter
+ private lateinit var mEntity: CatalogEntity
+ private var mCatalogId: String = ""
+ private var mPrimaryCatalogId: String = ""
+
+ override fun getLayoutId() = R.layout.fragment_sub_catalog
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ mCatalogId = arguments?.getString(EntranceUtils.KEY_CATALOG_ID) ?: ""
+ mPrimaryCatalogId = arguments?.getString(EntranceUtils.KEY_PRIMARY_CATALOG_ID) ?: ""
+ mViewModel = viewModelProvider(SubCatalogViewModel.Factory(mCatalogId))
+ mViewModel.getSubCatalogs(mPrimaryCatalogId)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ mViewModel.catalogs.observe(viewLifecycleOwner, Observer {
+ mReuseLoading.visibility = View.GONE
+ if (it != null) {
+ mReuseNoConnection.visibility = View.GONE
+ if (it.subCatalog.isNotEmpty()) {
+ mSubCatalogRv.visibility = View.VISIBLE
+ mReuseNoData.visibility = View.GONE
+ mEntity = it
+ initView()
+ } else {
+ mSubCatalogRv.visibility = View.GONE
+ mReuseNoData.visibility = View.VISIBLE
+ }
+ } else {
+ mSubCatalogRv.visibility = View.GONE
+ mReuseNoData.visibility = View.GONE
+ mReuseNoConnection.visibility = View.VISIBLE
+ mReuseNoConnection.setOnClickListener {
+ mReuseLoading.visibility = View.VISIBLE
+ mViewModel.getSubCatalogs(mPrimaryCatalogId)
+ }
+ }
+ })
+ }
+
+ private fun initView() {
+ mEntity.run {
+ mSubCatalogRv.layoutManager = GridLayoutManager(requireContext(), 3)
+ mSubCatalogAdapter = SubCatalogAdapter(requireContext(), mEntity, subCatalog)
+ mSubCatalogRv.adapter = mSubCatalogAdapter
+ }
+ }
+
+ fun changeSubCatalog(primaryCatalogId: String) {
+ mPrimaryCatalogId = primaryCatalogId
+ mSubCatalogRv.visibility = View.GONE
+ mReuseNoData.visibility = View.GONE
+ mReuseNoConnection.visibility = View.GONE
+ mReuseLoading.visibility = View.VISIBLE
+ mViewModel.getSubCatalogs(mPrimaryCatalogId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogViewModel.kt b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogViewModel.kt
new file mode 100644
index 0000000000..12acf47463
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogViewModel.kt
@@ -0,0 +1,44 @@
+package com.gh.gamecenter.catalog
+
+import android.annotation.SuppressLint
+import android.app.Application
+import androidx.lifecycle.AndroidViewModel
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import com.gh.gamecenter.entity.CatalogEntity
+import com.gh.gamecenter.retrofit.BiResponse
+import com.gh.gamecenter.retrofit.RetrofitManager
+import com.halo.assistant.HaloApp
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.schedulers.Schedulers
+
+class SubCatalogViewModel(application: Application, private val catalogId: String): AndroidViewModel(application) {
+
+ private val api = RetrofitManager.getInstance(getApplication()).api
+ var catalogs = MutableLiveData()
+
+
+ @SuppressLint("CheckResult")
+ fun getSubCatalogs(primaryCatalogId: String) {
+ api.getSubCatalogs(catalogId, primaryCatalogId)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(object : BiResponse() {
+ override fun onSuccess(data: CatalogEntity) {
+ catalogs.postValue(data)
+ }
+
+ override fun onFailure(exception: Exception) {
+ super.onFailure(exception)
+ catalogs.postValue(null)
+ }
+ })
+ }
+
+ class Factory(private val catalogId: String) : ViewModelProvider.NewInstanceFactory() {
+ override fun create(modelClass: Class): T {
+ return SubCatalogViewModel(HaloApp.getInstance().application, catalogId) as T
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/category/CategoryDirectoryActivity.kt b/app/src/main/java/com/gh/gamecenter/category/CategoryDirectoryActivity.kt
index faf8d247c3..e528b19922 100644
--- a/app/src/main/java/com/gh/gamecenter/category/CategoryDirectoryActivity.kt
+++ b/app/src/main/java/com/gh/gamecenter/category/CategoryDirectoryActivity.kt
@@ -4,7 +4,6 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import com.gh.common.util.EntranceUtils
-import com.gh.download.DownloadManager
import com.gh.gamecenter.NormalActivity
import com.gh.gamecenter.R
diff --git a/app/src/main/java/com/gh/gamecenter/entity/CatalogEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/CatalogEntity.kt
new file mode 100644
index 0000000000..3fe6082cd4
--- /dev/null
+++ b/app/src/main/java/com/gh/gamecenter/entity/CatalogEntity.kt
@@ -0,0 +1,59 @@
+package com.gh.gamecenter.entity
+
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+import kotlinx.android.parcel.Parcelize
+
+@Parcelize
+data class CatalogEntity(
+ @SerializedName("_id")
+ var id: String = "",
+ var name: String = "",
+ var switch: CatalogSwitch = CatalogSwitch(),
+ @SerializedName("has_special")
+ var hasSpecial: Boolean = false,
+ @SerializedName("sub_catalogs")
+ var subCatalog: List = emptyList()
+): Parcelable
+
+@Parcelize
+data class SubCatalogEntity(
+ @SerializedName("_id")
+ var id: String = "",
+ var name: String = "",
+ var icon: String = "",
+ var link: LinkEntity = LinkEntity(),
+ var recommended: Boolean = false
+): Parcelable
+
+@Parcelize
+data class CatalogSwitch(
+ @SerializedName("sort_hot")
+ var hotSort: String = "",
+ @SerializedName("sort_new")
+ var newSort: String = "",
+ @SerializedName("sort_star")
+ var starSort: String = ""
+): Parcelable
+
+@Parcelize
+data class SpecialCatalogEntity(
+ @SerializedName("_id")
+ var id: String = "",
+ var type: String = "",
+ var link: SpecialLink = SpecialLink(),
+ var image: Image = Image()
+): Parcelable
+
+@Parcelize
+data class SpecialLink(
+ @SerializedName("_id")
+ var id: String = "",
+ var data: List = emptyList()
+): LinkEntity(), Parcelable
+
+@Parcelize
+data class Image(
+ var url: String = "",
+ var title: String = ""
+): Parcelable
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 cd18696a01..0786ca9217 100644
--- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.kt
@@ -24,6 +24,7 @@ import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.ImagePagerAdapter
import com.gh.gamecenter.adapter.viewholder.*
import com.gh.gamecenter.baselist.LoadStatus
+import com.gh.gamecenter.catalog.CatalogActivity
import com.gh.gamecenter.category.CategoryDirectoryActivity
import com.gh.gamecenter.databinding.*
import com.gh.gamecenter.entity.CommunityEntity
@@ -419,6 +420,7 @@ class GameFragmentAdapter(context: Context,
entity.type == "column_collection" -> DirectUtils.directToColumnCollection(mContext, entity.link!!, -1, "(推荐入口)")
entity.type == "block" -> mContext.startActivity(BlockActivity.getIntent(mContext, entity, "(推荐入口)"))
entity.type == "category" -> mContext.startActivity(CategoryDirectoryActivity.getIntent(mContext, entity.link!!, entity.text!!))
+ entity.type == "catalog" -> mContext.startActivity(CatalogActivity.getIntent(mContext, entity.link!!, entity.text!!))
entity.type == "column" -> {
SubjectActivity.startSubjectActivity(mContext, entity.link, entity.text, entity.order
, StringUtils.buildString("(游戏-专题:", entity.name, "[1-", (data + 1).toString(), "]", ")"))
diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java
index 385d6d34b2..bbe1d9eabf 100644
--- a/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java
+++ b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java
@@ -11,6 +11,7 @@ import com.gh.gamecenter.entity.AuthDialogEntity;
import com.gh.gamecenter.entity.AvatarBorderEntity;
import com.gh.gamecenter.entity.BackgroundImageEntity;
import com.gh.gamecenter.entity.BadgeEntity;
+import com.gh.gamecenter.entity.CatalogEntity;
import com.gh.gamecenter.entity.CategoryEntity;
import com.gh.gamecenter.entity.CommentEntity;
import com.gh.gamecenter.entity.CommentnumEntity;
@@ -60,6 +61,7 @@ import com.gh.gamecenter.entity.SettingsEntity;
import com.gh.gamecenter.entity.SignEntity;
import com.gh.gamecenter.entity.SimpleGameEntity;
import com.gh.gamecenter.entity.SimulatorEntity;
+import com.gh.gamecenter.entity.SpecialCatalogEntity;
import com.gh.gamecenter.entity.SubjectEntity;
import com.gh.gamecenter.entity.SubjectRecommendEntity;
import com.gh.gamecenter.entity.SubjectRefreshEntity;
@@ -301,7 +303,7 @@ public interface ApiService {
* 获取专题数据
*/
@GET("columns/{column_id}/games")
- Observable> getColumn(@Path("column_id") String column_id, @Query("sort") String sort, @Query("filter") String order, @Query("page") int page);
+ Single> getColumn(@Path("column_id") String column_id, @Query("sort") String sort, @Query("filter") String order, @Query("page") int page);
/**
* 获取专题数据标题
@@ -2720,4 +2722,22 @@ public interface ApiService {
*/
@GET("devices/{device_id}/download_simulator_games")
Single> getSimulatorGames(@Path("device_id") String deviceId, @Query("page") int page, @Query("filter") String filter);
+
+ /**
+ * 获取一级分类数据
+ */
+ @GET("catalogs/{catalog_id}")
+ Single getCatalogs(@Path("catalog_id") String catalogId);
+
+ /**
+ * 获取一级分类数据 及其 二级分类数据
+ */
+ @GET("catalogs/{catalog_id}/{primary_catalog_id}")
+ Single getSubCatalogs(@Path("catalog_id") String catalogId, @Path("primary_catalog_id") String primaryCatalogId);
+
+ /**
+ * 获取精选分类
+ */
+ @GET("catalogs/{catalog_id}/special")
+ Single> getSpecialCatalogs(@Path("catalog_id") String catalogId, @Query("page") int page);
}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectListViewModel.kt b/app/src/main/java/com/gh/gamecenter/subject/SubjectListViewModel.kt
index 24ed674125..77c65c6b18 100644
--- a/app/src/main/java/com/gh/gamecenter/subject/SubjectListViewModel.kt
+++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectListViewModel.kt
@@ -12,6 +12,7 @@ import com.gh.gamecenter.entity.SubjectSettingEntity
import com.gh.gamecenter.retrofit.Response
import com.gh.gamecenter.retrofit.RetrofitManager
import io.reactivex.Observable
+import io.reactivex.Single
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
import retrofit2.HttpException
@@ -23,7 +24,9 @@ class SubjectListViewModel(application: Application,
var selectedLabelList = arrayListOf()
var selectedFilterSize = SubjectSettingEntity.Size(text = "全部大小")
- override fun provideDataObservable(page: Int): Observable> {
+ override fun provideDataObservable(page: Int): Observable>? = null
+
+ override fun provideDataSingle(page: Int): Single> {
return RetrofitManager.getInstance(getApplication()).sensitiveApi.getColumn(
subjectData.subjectId,
subjectData.sort,
diff --git a/app/src/main/res/drawable-xhdpi/ic_filter_arrow_down.png b/app/src/main/res/drawable-xhdpi/ic_filter_arrow_down.png
deleted file mode 100644
index 3efcaad3eb9e0c6bc464719cb1872a89eca101ff..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 357
zcmV-r0h<1aP)Jnv!&2k2=SA%wBHq9|Ipz(a-=%;6TTrced48GFuPCBq)R
zFdY*c|A1`cI`;g+er7nXtrB*F?LQ)yn8GL4LI}Mq=6hI=iK$rF7%PfmH$mDVgg#`Y
zx<|AVY^MQoI1Wi6=qK0}4r?N3vEPT`xccRqi9F9oy}OJqX7P<9oR4u*q!mIKq($k8
ze&fmTQ~!uHXGWjwqz+OA!C(Y-oFJW;d#^%ZvH~h&cbLa%X>*;pzF{?l@KV)i+#RK{
zh4@8i|o9=263D&8_7ZM*Jg@uSwLI`?BaLG&f24bBeAQqX0
zVYzsFoC8zr%47Q2_{ISpa}JOLeG1bjN@q7EhvkRh-Fj(`+cYVBX4p$;CHS|3=7
zNE8+Wd8DuFYfX=Rh)CKNN`dzPxzW4=et<)uti%3-QlJESI?y9NZh^7(x^>tt$Rk}H
zG!76SlM3u47CNp#CcAFxoC~oR5y|SH40wx00&E0qfCFF=ViwAPg>KvcmobRJ9`%gH
zPD7{)d5A>}HVv>>5h*-WuzfCzOq(JBb`Gq8ec)L{iUhdR!Wy_}gBWZMoEhvsVf%l5
jYh%_HF<7ZHzkt;*!LnTqOT{HS00000NkvXXu0mjfg$sT^
diff --git a/app/src/main/res/drawable-xxhdpi/ic_catalog_selected.png b/app/src/main/res/drawable-xxhdpi/ic_catalog_selected.png
new file mode 100755
index 0000000000000000000000000000000000000000..08fdeaa2d3bb9c1d0e5b5cb765004ce6a02d89eb
GIT binary patch
literal 2071
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
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_catalog_selected.png b/app/src/main/res/drawable-xxxhdpi/ic_catalog_selected.png
new file mode 100755
index 0000000000000000000000000000000000000000..c08b75847804801678fb032521bd063edeca574d
GIT binary patch
literal 2790
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
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_filter_arrow_down.png b/app/src/main/res/drawable-xxxhdpi/ic_filter_arrow_down.png
new file mode 100755
index 0000000000000000000000000000000000000000..8e70509fa2e48a5fd84bf94b9d1f69d9103fd5b1
GIT binary patch
literal 1128
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
RT95z$002ovPDHLkV1lKua$W!c
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/bg_sub_catalog_item.xml b/app/src/main/res/drawable/bg_sub_catalog_item.xml
new file mode 100644
index 0000000000..6710f5e133
--- /dev/null
+++ b/app/src/main/res/drawable/bg_sub_catalog_item.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bg_tag_text.xml b/app/src/main/res/drawable/bg_tag_text.xml
new file mode 100644
index 0000000000..078c47dd4e
--- /dev/null
+++ b/app/src/main/res/drawable/bg_tag_text.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/catalog_header_item.xml b/app/src/main/res/layout/catalog_header_item.xml
new file mode 100644
index 0000000000..6859798ffc
--- /dev/null
+++ b/app/src/main/res/layout/catalog_header_item.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/catalog_image_item.xml b/app/src/main/res/layout/catalog_image_item.xml
new file mode 100644
index 0000000000..5312f8daa0
--- /dev/null
+++ b/app/src/main/res/layout/catalog_image_item.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/catalog_item.xml b/app/src/main/res/layout/catalog_item.xml
new file mode 100644
index 0000000000..d043ce89f6
--- /dev/null
+++ b/app/src/main/res/layout/catalog_item.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/catalog_subject_collection_item.xml b/app/src/main/res/layout/catalog_subject_collection_item.xml
new file mode 100644
index 0000000000..2cfeff5c6e
--- /dev/null
+++ b/app/src/main/res/layout/catalog_subject_collection_item.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/catalog_subject_collection_list_item.xml b/app/src/main/res/layout/catalog_subject_collection_list_item.xml
new file mode 100644
index 0000000000..5d1e42dee8
--- /dev/null
+++ b/app/src/main/res/layout/catalog_subject_collection_list_item.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/catalog_subject_game_item.xml b/app/src/main/res/layout/catalog_subject_game_item.xml
new file mode 100644
index 0000000000..33153bc6f3
--- /dev/null
+++ b/app/src/main/res/layout/catalog_subject_game_item.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/catalog_subject_item.xml b/app/src/main/res/layout/catalog_subject_item.xml
new file mode 100644
index 0000000000..009bbac5a7
--- /dev/null
+++ b/app/src/main/res/layout/catalog_subject_item.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_catalog.xml b/app/src/main/res/layout/fragment_catalog.xml
new file mode 100644
index 0000000000..cfa38a7b4a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_catalog.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_catalog_list.xml b/app/src/main/res/layout/fragment_catalog_list.xml
new file mode 100644
index 0000000000..3611e77cc9
--- /dev/null
+++ b/app/src/main/res/layout/fragment_catalog_list.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_sub_catalog.xml b/app/src/main/res/layout/fragment_sub_catalog.xml
new file mode 100644
index 0000000000..bd9d05eb74
--- /dev/null
+++ b/app/src/main/res/layout/fragment_sub_catalog.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/game_item.xml b/app/src/main/res/layout/game_item.xml
index de87516be1..96d3bb5628 100644
--- a/app/src/main/res/layout/game_item.xml
+++ b/app/src/main/res/layout/game_item.xml
@@ -8,6 +8,8 @@
+
+
@@ -148,11 +150,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
- android:drawableLeft="@drawable/game_horizontal_rating"
+ android:drawableLeft="@{game.commentCount > 3?@drawable/game_horizontal_rating: null}"
android:drawablePadding="4dp"
android:includeFontPadding="false"
- android:paddingRight="8dp"
- android:text="@{game.commentCount > 3?game.star + ``: `评分过少`}"
+ android:paddingRight="@{game.commentCount > 3?DisplayUtils.dip2px(8F): 0}"
+ android:text="@{game.commentCount > 3?game.star + ``: ``}"
android:textColor="@{Color.parseColor(game.commentCount > 3?`#1383EB`:`#2496FF`)}"
android:textStyle="bold"
android:visibility="gone" />
diff --git a/app/src/main/res/layout/item_filter_size.xml b/app/src/main/res/layout/item_filter_size.xml
index a65ea1370e..27fbc54b6f 100644
--- a/app/src/main/res/layout/item_filter_size.xml
+++ b/app/src/main/res/layout/item_filter_size.xml
@@ -1,22 +1,34 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_catalog_filter.xml b/app/src/main/res/layout/layout_catalog_filter.xml
new file mode 100644
index 0000000000..ce480c9c02
--- /dev/null
+++ b/app/src/main/res/layout/layout_catalog_filter.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_filter_size.xml b/app/src/main/res/layout/layout_filter_size.xml
index 0a6fa9aa17..05a487074b 100644
--- a/app/src/main/res/layout/layout_filter_size.xml
+++ b/app/src/main/res/layout/layout_filter_size.xml
@@ -11,7 +11,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/all_white"
- android:paddingTop="10dp"
+ android:paddingBottom="8dp"
app:flexDirection="row"
app:flexWrap="wrap" />
diff --git a/app/src/main/res/layout/sub_catalog_item.xml b/app/src/main/res/layout/sub_catalog_item.xml
new file mode 100644
index 0000000000..f353517857
--- /dev/null
+++ b/app/src/main/res/layout/sub_catalog_item.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 9e731edf75..7d316dd335 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -211,6 +211,7 @@
#FFA142
#06CCF4
#F8A142
+ #757575
#99666666
From 24214c5d6bdca87870ec005913f66c85aa43d750 Mon Sep 17 00:00:00 2001
From: lyr <15622190878@163.com>
Date: Fri, 20 Nov 2020 09:13:35 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E4=BC=98=E5=8C=96"=E6=96=B0=E5=88=86?=
=?UTF-8?q?=E7=B1=BB"=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/gh/gamecenter/Injection.java | 2 +-
.../java/com/gh/common/util/DirectUtils.kt | 2 +-
.../com/gh/common/view/CatalogFilterView.kt | 10 ++--
.../catalog/SpecialCatalogAdapter.kt | 48 ++++++++++++++++++-
.../gamecenter/catalog/SubCatalogAdapter.kt | 1 +
app/src/main/res/layout/catalog_item.xml | 1 -
6 files changed, 54 insertions(+), 10 deletions(-)
diff --git a/app/src/debug/java/com/gh/gamecenter/Injection.java b/app/src/debug/java/com/gh/gamecenter/Injection.java
index 86d42a1f0b..66aaa90296 100644
--- a/app/src/debug/java/com/gh/gamecenter/Injection.java
+++ b/app/src/debug/java/com/gh/gamecenter/Injection.java
@@ -28,7 +28,7 @@ public class Injection {
public static OkHttpClient.Builder provideRetrofitBuilder() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
- interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
+ interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
builder.addNetworkInterceptor(interceptor);
builder.addNetworkInterceptor(new StethoInterceptor());
return builder;
diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt
index d29399f28a..614d0f0e3a 100644
--- a/app/src/main/java/com/gh/common/util/DirectUtils.kt
+++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt
@@ -899,7 +899,7 @@ object DirectUtils {
fun directCatalog(context: Context, catalogId: String, catalogTitle: String, entrance: String? = null, path: String? = "") {
if (catalogId.isEmpty()) return
val bundle = Bundle()
- bundle.putString(KEY_TO, CategoryDirectoryActivity::class.java.name)
+ bundle.putString(KEY_TO, CatalogActivity::class.java.name)
bundle.putString(KEY_CATALOG_ID, catalogId)
bundle.putString(KEY_CATALOG_TITLE, catalogTitle)
bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER)
diff --git a/app/src/main/java/com/gh/common/view/CatalogFilterView.kt b/app/src/main/java/com/gh/common/view/CatalogFilterView.kt
index 431816db78..21e02d6ef4 100644
--- a/app/src/main/java/com/gh/common/view/CatalogFilterView.kt
+++ b/app/src/main/java/com/gh/common/view/CatalogFilterView.kt
@@ -298,11 +298,11 @@ class CatalogFilterView @JvmOverloads constructor(context: Context, attrs: Attri
private fun getDefaultSizeFilterArray(): ArrayList {
return arrayListOf().apply {
add(SubjectSettingEntity.Size(min = -1, max = -1, text = "全部大小"))
- add(SubjectSettingEntity.Size(min = -1, max = 20, text = "20M以下"))
- add(SubjectSettingEntity.Size(min = 20, max = 50, text = "20-50M"))
- add(SubjectSettingEntity.Size(min = 50, max = 100, text = "50-100M"))
- add(SubjectSettingEntity.Size(min = 100, max = 500, text = "100-500M"))
- add(SubjectSettingEntity.Size(min = 500, max = -1, text = "500M以上"))
+ add(SubjectSettingEntity.Size(min = -1, max = 100, text = "100M以下"))
+ add(SubjectSettingEntity.Size(min = 100, max = 300, text = "100-300M"))
+ add(SubjectSettingEntity.Size(min = 300, max = 500, text = "300-500M"))
+ add(SubjectSettingEntity.Size(min = 500, max = 1000, text = "100M-1G"))
+ add(SubjectSettingEntity.Size(min = 1000, max = -1, text = "1G以上"))
}
}
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt
index 5c828abd79..a945c52e5d 100644
--- a/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SpecialCatalogAdapter.kt
@@ -22,6 +22,52 @@ import com.gh.gamecenter.subject.SubjectActivity.Companion.startSubjectActivity
class SpecialCatalogAdapter(context: Context) : ListAdapter(context) {
+ override fun getItemCount() = if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT
+
+ override fun areItemsTheSame(oldItem: SpecialCatalogItemData?, newItem: SpecialCatalogItemData?): Boolean {
+ return when {
+ oldItem?.header != null && newItem?.header != null -> {
+ oldItem.header.id == newItem.header.id
+ }
+
+ oldItem?.bigImage != null && newItem?.bigImage != null -> {
+ oldItem.bigImage.id == newItem.bigImage.id
+ }
+
+ oldItem?.subject != null && newItem?.subject != null -> {
+ oldItem.subject.id == newItem.subject.id
+ }
+
+ oldItem?.subjectCollection != null && newItem?.subjectCollection != null -> {
+ oldItem.subjectCollection.id == newItem.subjectCollection.id
+ }
+
+ else -> super.areItemsTheSame(oldItem, newItem)
+ }
+ }
+
+ override fun areContentsTheSame(oldItem: SpecialCatalogItemData?, newItem: SpecialCatalogItemData?): Boolean {
+ return when {
+ oldItem?.header != null && newItem?.header != null -> {
+ oldItem.header.id == newItem.header.id
+ }
+
+ oldItem?.bigImage != null && newItem?.bigImage != null -> {
+ oldItem.bigImage.id == newItem.bigImage.id
+ }
+
+ oldItem?.subject != null && newItem?.subject != null -> {
+ oldItem.subject.id == newItem.subject.id
+ }
+
+ oldItem?.subjectCollection != null && newItem?.subjectCollection != null -> {
+ oldItem.subjectCollection.id == newItem.subjectCollection.id
+ }
+
+ else -> super.areItemsTheSame(oldItem, newItem)
+ }
+ }
+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val view: View
return when (viewType) {
@@ -98,8 +144,6 @@ class SpecialCatalogAdapter(context: Context) : ListAdapter(binding.root)
class CatalogHeaderItemHolder(val binding: CatalogHeaderItemBinding) : BaseRecyclerViewHolder(binding.root)
diff --git a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
index 41a7c2ed3a..fed4d6a710 100644
--- a/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/catalog/SubCatalogAdapter.kt
@@ -24,6 +24,7 @@ class SubCatalogAdapter(context: Context, private val mPrimaryCatalog: CatalogEn
holder.binding.run {
val catalogEntity = mList[position]
entity = catalogEntity
+ executePendingBindings()
root.setOnClickListener {
root.context.startActivity(NewCatalogListActivity.getIntent(mContext, catalogEntity.name, mPrimaryCatalog, catalogEntity.name))
}
diff --git a/app/src/main/res/layout/catalog_item.xml b/app/src/main/res/layout/catalog_item.xml
index d043ce89f6..54f3309eb9 100644
--- a/app/src/main/res/layout/catalog_item.xml
+++ b/app/src/main/res/layout/catalog_item.xml
@@ -35,7 +35,6 @@
Date: Fri, 20 Nov 2020 09:17:03 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=89=E7=8E=AF?=
=?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=EF=BC=88?=
=?UTF-8?q?2020=E5=B9=B411=E6=9C=88=E7=AC=AC1=E5=91=A8=EF=BC=891-4=20https?=
=?UTF-8?q?://gitlab.ghzs.com/pm/halo-app-issues/-/issues/1057?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/gh/common/view/ConfigFilterView.kt | 29 ++++------
.../category/NewCategoryHorizontalAdapter.kt | 11 +---
.../category/NewCategoryListAdapter.kt | 4 ++
.../category/NewCategoryListFragment.kt | 2 +
.../search/SearchDefaultFragment.kt | 13 +++--
.../search/SearchGameIndexAdapter.kt | 52 +++++++++++-------
.../gamecenter/tag/TagsHorizontalAdapter.kt | 13 +----
.../com/gh/gamecenter/tag/TagsListAdapter.kt | 4 ++
.../com/gh/gamecenter/tag/TagsListFragment.kt | 2 +
.../drawable-xhdpi/search_history_delete.png | Bin 408 -> 0 bytes
.../drawable-xxhdpi/search_history_delete.png | Bin 0 -> 1066 bytes
.../search_history_delete.png | Bin 0 -> 861 bytes
.../main/res/drawable/actionbar_search_bg.xml | 10 ++--
.../res/layout/fm_search_history_item.xml | 44 +++++++--------
.../res/layout/fragment_search_default.xml | 43 +++++----------
app/src/main/res/layout/fragment_tags.xml | 12 +++-
.../main/res/layout/layout_config_filter.xml | 13 ++---
.../res/layout/search_default_hot_item.xml | 18 +++---
.../res/layout/search_game_index_item.xml | 21 +++++++
app/src/main/res/layout/toolbar_search.xml | 31 +++++++----
app/src/main/res/values/colors.xml | 1 +
21 files changed, 177 insertions(+), 146 deletions(-)
delete mode 100644 app/src/main/res/drawable-xhdpi/search_history_delete.png
create mode 100755 app/src/main/res/drawable-xxhdpi/search_history_delete.png
create mode 100755 app/src/main/res/drawable-xxxhdpi/search_history_delete.png
create mode 100644 app/src/main/res/layout/search_game_index_item.xml
diff --git a/app/src/main/java/com/gh/common/view/ConfigFilterView.kt b/app/src/main/java/com/gh/common/view/ConfigFilterView.kt
index cec37b79a6..e0460afa1e 100644
--- a/app/src/main/java/com/gh/common/view/ConfigFilterView.kt
+++ b/app/src/main/java/com/gh/common/view/ConfigFilterView.kt
@@ -12,7 +12,7 @@ import android.widget.PopupWindow
import android.widget.TextView
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
-import com.gh.common.util.DisplayUtils
+import com.gh.common.util.toColor
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.SubjectSettingEntity
import com.google.android.flexbox.FlexboxLayout
@@ -69,16 +69,13 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
mOnConfigFilterSetupListener = onConfigFilterSetupListener
}
- fun toggleHighlightedTextView(targetTextView: TextView, highlightIt: Boolean) {
+ private fun toggleHighlightedTextView(targetTextView: TextView, highlightIt: Boolean) {
if (highlightIt) {
- targetTextView.background = ContextCompat.getDrawable(targetTextView.context, R.drawable.text_blue_background)
+ targetTextView.background = ContextCompat.getDrawable(targetTextView.context, R.drawable.bg_tag_text)
targetTextView.setTextColor(Color.WHITE)
} else {
- val colorDrawable = GradientDrawable()
- colorDrawable.setColor(Color.WHITE)
- colorDrawable.cornerRadius = DisplayUtils.dip2px(1.5f).toFloat()
- targetTextView.background = colorDrawable
- targetTextView.setTextColor(ContextCompat.getColor(targetTextView.context, R.color.text_3a3a3a))
+ targetTextView.background = null
+ targetTextView.setTextColor(ContextCompat.getColor(targetTextView.context, R.color.text_757575))
}
}
@@ -88,8 +85,8 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
drawableUp?.setBounds(0, 0, drawableUp.minimumWidth, drawableUp.minimumHeight)
drawableDown?.setBounds(0, 0, drawableDown.minimumWidth, drawableDown.minimumHeight)
+ sizeTv.setTextColor(R.color.theme_font.toColor())
sizeTv.setCompoundDrawables(null, null, drawableUp, null)
- sizeTv.text = "收起"
val inflater = LayoutInflater.from(sizeTv.context)
val layout = inflater.inflate(R.layout.layout_filter_size, null)
@@ -146,10 +143,8 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
}
popupWindow.setOnDismissListener {
+ sizeTv.setTextColor(R.color.text_757575.toColor())
sizeTv.setCompoundDrawables(null, null, drawableDown, null)
- if (sizeTv.text == "收起") {
- sizeTv.text = sizeText
- }
}
popupWindow.isTouchable = true
@@ -160,11 +155,11 @@ class ConfigFilterView @JvmOverloads constructor(context: Context, attrs: Attrib
private fun getDefaultSizeFilterArray(): ArrayList {
return arrayListOf().apply {
add(SubjectSettingEntity.Size(min = -1, max = -1, text = "全部大小"))
- add(SubjectSettingEntity.Size(min = -1, max = 20, text = "20M以下"))
- add(SubjectSettingEntity.Size(min = 20, max = 50, text = "20-50M"))
- add(SubjectSettingEntity.Size(min = 50, max = 100, text = "50-100M"))
- add(SubjectSettingEntity.Size(min = 100, max = 500, text = "100-500M"))
- add(SubjectSettingEntity.Size(min = 500, max = -1, text = "500M以上"))
+ add(SubjectSettingEntity.Size(min = -1, max = 100, text = "100M以下"))
+ add(SubjectSettingEntity.Size(min = 100, max = 300, text = "100-300M"))
+ add(SubjectSettingEntity.Size(min = 300, max = 500, text = "300-500M"))
+ add(SubjectSettingEntity.Size(min = 500, max = 1000, text = "100M-1G"))
+ add(SubjectSettingEntity.Size(min = 1000, max = -1, text = "1G以上"))
}
}
diff --git a/app/src/main/java/com/gh/gamecenter/category/NewCategoryHorizontalAdapter.kt b/app/src/main/java/com/gh/gamecenter/category/NewCategoryHorizontalAdapter.kt
index 430bdfd80b..cd078096e8 100644
--- a/app/src/main/java/com/gh/gamecenter/category/NewCategoryHorizontalAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/category/NewCategoryHorizontalAdapter.kt
@@ -27,21 +27,16 @@ class NewCategoryHorizontalAdapter(context: Context,
override fun onBindViewHolder(holder: TagsViewHolder, position: Int) {
val categoryEntity = mCategoryList[position]
- val gradientDrawable = GradientDrawable()
- gradientDrawable.shape = GradientDrawable.RECTANGLE
if (mViewModel.selectedCategory.name == categoryEntity.name) {
- gradientDrawable.setColor(ContextCompat.getColor(mContext, R.color.theme))
- gradientDrawable.cornerRadius = DisplayUtils.dip2px(999f).toFloat()
+ holder.tagTv.background = ContextCompat.getDrawable(mContext, R.drawable.bg_tag_text)
holder.tagTv.setTextColor(Color.WHITE)
} else {
- gradientDrawable.setColor(Color.WHITE)
- gradientDrawable.cornerRadius = DisplayUtils.dip2px(999f).toFloat()
- holder.tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.text_3a3a3a))
+ holder.tagTv.background = null
+ holder.tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.text_757575))
}
holder.tagTv.text = categoryEntity.name
- holder.tagTv.background = gradientDrawable
holder.tagTv.setOnClickListener {
mViewModel.changeSelectedCategory(categoryEntity)
notifyDataSetChanged()
diff --git a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt
index affa700591..6143b0e9cb 100644
--- a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListAdapter.kt
@@ -11,6 +11,7 @@ import com.gh.common.exposure.ExposureType
import com.gh.common.exposure.IExposable
import com.gh.common.util.DownloadItemUtils
import com.gh.common.util.StringUtils
+import com.gh.common.util.dip2px
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
@@ -85,6 +86,9 @@ class NewCategoryListAdapter(context: Context,
holder.initServerType(gameEntity)
holder.binding.executePendingBindings()
+ val padTop = if (position == 0) 16F.dip2px() else 8F.dip2px()
+ holder.itemView.setPadding(16F.dip2px(), padTop, 16F.dip2px(), 8F.dip2px())
+
gameEntity.sequence = position + 1
val sortType = if ("download:-1" == mViewModel.getSortType()) "最热" else "最新"
diff --git a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt
index c0be80e13e..b40ef98c2f 100644
--- a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt
@@ -114,6 +114,8 @@ class NewCategoryListFragment : ListFragment() {
val flexCell = TextView(context)
flexView.addView(flexCell)
- val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 25F.dip2px())
+ val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
params.setMargins(0, 0, 16F.dip2px(), 16F.dip2px())
flexCell.layoutParams = params
flexCell.setSingleLine()
flexCell.ellipsize = TextUtils.TruncateAt.END
- flexCell.textSize = 13f
+ flexCell.textSize = 12F
flexCell.gravity = Gravity.CENTER
flexCell.text = contentList[index]
- flexCell.setTextColor(Color.WHITE)
- flexCell.setPadding(10F.dip2px(), 0, 10F.dip2px(), 0)
+ flexCell.maxEms = 6
+ flexCell.setTextColor(R.color.text_666666.toColor())
+ if (!isHistoryFlex) flexCell.setPadding(8F.dip2px(), 6F.dip2px(), 8F.dip2px(), 6F.dip2px())
flexCell.background = if (isHistoryFlex) {
- DrawableView.getOvalDrawable(R.color.text_d5d5d5)
+ null
} else {
- DrawableView.getOvalDrawable(R.color.theme)
+ DrawableView.getOvalDrawable(R.color.text_F5F5F5)
}
flexCell.setOnClickListener {
clickListener.invoke(index)
diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt
index ff35b8c683..be2be22431 100644
--- a/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameIndexAdapter.kt
@@ -14,18 +14,18 @@ import com.gh.common.exposure.ExposureType
import com.gh.common.exposure.IExposable
import com.gh.common.filter.RegionSettingHelper
import com.gh.common.util.*
+import com.gh.common.view.DrawableView
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.SearchType
import com.gh.gamecenter.adapter.viewholder.GameViewHolder
import com.gh.gamecenter.adapter.viewholder.SearchHistoryViewHolder
import com.gh.gamecenter.baselist.ListAdapter
-import com.gh.gamecenter.databinding.GameItemBinding
+import com.gh.gamecenter.databinding.SearchGameIndexItemBinding
import com.gh.gamecenter.db.SearchHistoryDao
import com.gh.gamecenter.entity.GameEntity
import com.gh.gamecenter.eventbus.EBDownloadStatus
import com.gh.gamecenter.eventbus.EBSearch
-import com.gh.gamecenter.game.GameItemViewHolder
import com.lightgame.download.DownloadEntity
import com.lightgame.utils.Util_System_Keyboard
import org.greenrobot.eventbus.EventBus
@@ -66,8 +66,8 @@ class SearchGameIndexAdapter(context: Context,
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if (viewType == ItemViewType.GAME_NORMAL) {
val itemView = LayoutInflater.from(viewGroup.context)
- .inflate(R.layout.game_item, viewGroup, false)
- GameItemViewHolder(GameItemBinding.bind(itemView))
+ .inflate(R.layout.search_game_index_item, viewGroup, false)
+ SearchGameIndexItemViewHolder(SearchGameIndexItemBinding.bind(itemView))
} else {
val itemView = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.fm_search_history_item, viewGroup, false)
@@ -87,19 +87,11 @@ class SearchGameIndexAdapter(context: Context,
ExposureType.EXPOSURE)
exposureEventArray!!.put(position, exposureEvent)
- if (holder is GameItemViewHolder) {
- if (position == 0) {
- holder.itemView.setPadding(
- DisplayUtils.dip2px(16f), DisplayUtils.dip2px(20f),
- DisplayUtils.dip2px(20f), DisplayUtils.dip2px(8f))
- } else {
- holder.itemView.setPadding(
- DisplayUtils.dip2px(16f), DisplayUtils.dip2px(8f),
- DisplayUtils.dip2px(20f), DisplayUtils.dip2px(8f))
- }
-
+ if (holder is SearchGameIndexItemViewHolder) {
val binding = holder.binding
- binding.game = gameEntity
+ binding.gameItemIncluded.game = gameEntity
+ binding.divider.goneIf(position == 0)
+ binding.gameItemIncluded.root.setPadding(16F.dip2px(), 16F.dip2px(), 16F.dip2px(), 16F.dip2px())
holder.initServerType(gameEntity)
binding.executePendingBindings()
@@ -126,7 +118,7 @@ class SearchGameIndexAdapter(context: Context,
DownloadItemUtils.setOnClickListenerWithInvokeCallbackForAllState(
mContext,
- binding.downloadBtn,
+ binding.gameItemIncluded.downloadBtn,
gameEntity,
holder.adapterPosition,
this,
@@ -134,7 +126,7 @@ class SearchGameIndexAdapter(context: Context,
"搜索-列表:" + gameEntity.name!!,
exposureEvent, object : EmptyCallback {
override fun onCallback() {
- Util_System_Keyboard.hideSoftKeyboardByIBinder(mContext, binding.downloadBtn.windowToken)
+ Util_System_Keyboard.hideSoftKeyboardByIBinder(mContext, binding.gameItemIncluded.downloadBtn.windowToken)
if (searchMap[gameEntity.id] == null) {
EventBus.getDefault().post(EBSearch("search", gameEntity.id, gameEntity.name))
@@ -150,10 +142,9 @@ class SearchGameIndexAdapter(context: Context,
}
)
- DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(binding), true)
+ DownloadItemUtils.updateItem(mContext, gameEntity, GameViewHolder(binding.gameItemIncluded), true)
} else if (holder is SearchHistoryViewHolder) {
holder.searchHistoryName.text = gameEntity.name
- holder.searchHistoryLine.visibility = View.GONE
holder.itemView.setOnClickListener {
if (searchMap[gameEntity.id] == null) {
EventBus.getDefault().post(EBSearch("search", gameEntity.id, gameEntity.name))
@@ -215,4 +206,25 @@ class SearchGameIndexAdapter(context: Context,
}
}
}
+
+ class SearchGameIndexItemViewHolder(var binding: SearchGameIndexItemBinding) : RecyclerView.ViewHolder(binding.root) {
+ fun initServerType(gameEntity: GameEntity) {
+ val serverLabel = gameEntity.serverLabel
+ when {
+ gameEntity.test != null -> {
+ binding.gameItemIncluded.gameKaifuType.visibility = View.GONE
+ binding.gameItemIncluded.gameKaifuType.text = ""
+ }
+ serverLabel != null -> {
+ binding.gameItemIncluded.gameKaifuType.visibility = View.VISIBLE
+ binding.gameItemIncluded.gameKaifuType.text = serverLabel.value
+ binding.gameItemIncluded.gameKaifuType.background = DrawableView.getServerDrawable(serverLabel.color)
+ }
+ else -> binding.gameItemIncluded.gameKaifuType.visibility = View.GONE
+ }
+
+ // 由于RecyclerView的复用机制 需要每次测量gameName的宽
+ binding.gameItemIncluded.gameName.requestLayout()
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/gh/gamecenter/tag/TagsHorizontalAdapter.kt b/app/src/main/java/com/gh/gamecenter/tag/TagsHorizontalAdapter.kt
index 0c5d7da21f..c68ae9a698 100644
--- a/app/src/main/java/com/gh/gamecenter/tag/TagsHorizontalAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/tag/TagsHorizontalAdapter.kt
@@ -2,14 +2,12 @@ package com.gh.gamecenter.tag
import android.content.Context
import android.graphics.Color
-import android.graphics.drawable.GradientDrawable
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.core.content.ContextCompat
import butterknife.BindView
import com.gh.base.BaseRecyclerViewHolder
-import com.gh.common.util.DisplayUtils
import com.gh.gamecenter.R
import com.gh.gamecenter.entity.TagEntity
import com.lightgame.adapter.BaseRecyclerAdapter
@@ -26,21 +24,16 @@ class TagsHorizontalAdapter(context: Context,
override fun onBindViewHolder(holder: TagsViewHolder, position: Int) {
val tagEntity = mTagList[position]
- val gradientDrawable = GradientDrawable()
- gradientDrawable.shape = GradientDrawable.RECTANGLE
if (mViewModel.selectedTag.name == tagEntity.name) {
- gradientDrawable.setColor(ContextCompat.getColor(mContext, R.color.theme))
- gradientDrawable.cornerRadius = DisplayUtils.dip2px(999f).toFloat()
+ holder.tagTv.background = ContextCompat.getDrawable(mContext, R.drawable.bg_tag_text)
holder.tagTv.setTextColor(Color.WHITE)
} else {
- gradientDrawable.setColor(Color.WHITE)
- gradientDrawable.cornerRadius = DisplayUtils.dip2px(999f).toFloat()
- holder.tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.text_3a3a3a))
+ holder.tagTv.background = null
+ holder.tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.text_757575))
}
holder.tagTv.text = tagEntity.name
- holder.tagTv.background = gradientDrawable
holder.tagTv.setOnClickListener {
mViewModel.changeSelectedTag(tagEntity)
notifyDataSetChanged()
diff --git a/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt b/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt
index 5aa69e1f41..83d913e38d 100644
--- a/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt
+++ b/app/src/main/java/com/gh/gamecenter/tag/TagsListAdapter.kt
@@ -9,6 +9,7 @@ import com.gh.common.exposure.ExposureSource
import com.gh.common.exposure.IExposable
import com.gh.common.util.DownloadItemUtils
import com.gh.common.util.StringUtils
+import com.gh.common.util.dip2px
import com.gh.gamecenter.GameDetailActivity
import com.gh.gamecenter.R
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder
@@ -82,6 +83,9 @@ class TagsListAdapter(context: Context,
holder.initServerType(gameEntity)
holder.binding.executePendingBindings()
+ val padTop = if (position == 0) 16F.dip2px() else 8F.dip2px()
+ holder.itemView.setPadding(16F.dip2px(), padTop, 16F.dip2px(), 8F.dip2px())
+
gameEntity.sequence = position + 1
val exposureSource = ExposureSource("标签详情", "${mViewModel.selectedTag.name} + ${mViewModel.getSortTypeInChinese()}")
diff --git a/app/src/main/java/com/gh/gamecenter/tag/TagsListFragment.kt b/app/src/main/java/com/gh/gamecenter/tag/TagsListFragment.kt
index 522d781cfd..899aa3bd5b 100644
--- a/app/src/main/java/com/gh/gamecenter/tag/TagsListFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/tag/TagsListFragment.kt
@@ -121,6 +121,8 @@ class TagsListFragment : ListFragment() {
DownloadManager.getInstance(context).removeObserver(mDataWatcher)
}
+ override fun getItemDecoration() = null
+
override fun getLayoutId(): Int {
return R.layout.fragment_tags
}
diff --git a/app/src/main/res/drawable-xhdpi/search_history_delete.png b/app/src/main/res/drawable-xhdpi/search_history_delete.png
deleted file mode 100644
index b1803b9e40b8ed17426d02265b99bd8d3d9ca9d5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 408
zcmV;J0cZY+P)g7V}fLz4R!a@R;aZY}LuMqqJDMBEfMbe~-m0)51K&-6QLb0|wok${B
zq=;1ni=+$4B|cJk28ZF!j1N)>E*R$Qz4lpaX7*uEE6Xx97{><2D){f1k1-xr3AF3f
zv5Y79fb$YJhy^U+0*e*=1iB%FD*mLEW!Vort$T`l
z;CCCNg+vFl*u>>c6k?1ZgfM_t*ora!&G~^+{d26lIz6|=c-lKzOqLDuxT*R5FxXGC
zY*0qWRfF>$O{YuBErt*}bplNW!}x@d;`ex))-Mt_d>?~yU9rA(n~nbsj|Pth55S;l
z=KR7AzNL7}^^`rpcB;9v!5_>N;?ITk5$5u7U4`-|>ZSWogKcvit`7IL0d0
zaMq+6LdbPq<0rn>8T2rPFZk%@hu{KxcoSpn6^VZ+9zK`~NW?1u0000Px&&28Rw^ShIi%7yZ6p>LKq4k=)Lc|=bZ27
z{=BP3U3HIF?R!}ieRY0Acoq3PP^9(v!R-w`lF~pLi@T)bIYO5X93@k1#9@*X9t(c6@=PUH}
z_5IdJXw6&`A!O2yGB@P&?#TdKL}dzEMcV*0J%vKSHEFNc%W7wUT`|#lZklF0jkSDO
z3{-u^L=eZh7OaI>vzQnIV=*xW*R$E|4H$wbSxo{$3@peN+Q&5s;Gc3T?SS#|akI6x
z^%ABp==b|yMro-Ec!Sq
ze4?*wbr@<=n?C5v$(I7c_B+{t2S)+1XYB+mJY#ltb_CgdK|6}t2mwCg7%1CzaKtEYBfBs#cf#Rt&?!h8$A}@;;@DvYp^sMj=t=?Ena=*^
z=B5D+zjZt`B1vcV%$&AHVu&TjsZ;5_s(>sZk(Fpw`eID9DvZ+hHvuVy4$62KkXt1W
zD|A>Pw+gt8{}*dWoV=n{B`wB8tHLO4QiX80&f7jQWf$#GD8vhX8Xrzx%F~%lMmmXU
zvt!6{crIzu2YorlY(>#i8-O2)
z0yzkg27VssSwK`^cmX?PUlwLF@s9uguNOJ;fUMfK1C4x>E!9=4MRKdGLBM)`fszGFhEB
z)OO;-ZG|B58Vh`UJ#c
z=nf&{W85LtJmA!U^BtT?B$bHA$wIbz*AFGXK*(4qC!_;JB9YB7*n;V%n#VV
kqJ4!bKf!q;ZE+Rv5ARXTjYmWri2wiq07*qoM6N<$g0KGbDF6Tf
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable-xxxhdpi/search_history_delete.png b/app/src/main/res/drawable-xxxhdpi/search_history_delete.png
new file mode 100755
index 0000000000000000000000000000000000000000..313a4ee3501dac01349d71267bc4007e46983dbb
GIT binary patch
literal 861
zcmV-j1ETziP)Px&7fD1xRA>e5S-*=DK@@glI5|+0b7S$&-)c{-C-NQUjbW(T+jOzaNS`Wzi|cd;^>ET?smJ!q|UN>!8B8)
z%=7vvF;bQ|Jr;0txk#+B0Q}haB7wu<@VL~4JbSaJl4%ILNwnhiSb8p!*!Y_m34MlR
znZc0HKz`3UkLo|J6Rg|DD0mfXp9;Br+E+BexB|ev)vy;d-KDC>dS?n|EC5wMmrm%)
zWqohT`Ltw;L9ryCo{O9_7Ld>9U%~OK0B>M#UKhF(QN`F`a>}7pDs8i_kH!LOwc1Z~
z;+}MvOeVMSUgxy5r706P#gLqoL#0v~N}H681t`!KI`B<6tb_1ryWKu1Y^jLEN!%b?
zXF?Twi}gk0(gK>z=65(XHODdny;g77w5en&aS)m
zQWQaVHn?se`JFhNu?t}GPN#EfG#XukejfXk9wkcH%WFKpYy_UJm5;!G
n!1ywk%RQ;r>$}T*Omlw#i5w}7*1Oo$00000NkvXXu0mjfGX9na
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/actionbar_search_bg.xml b/app/src/main/res/drawable/actionbar_search_bg.xml
index 22f407e085..737aab1104 100644
--- a/app/src/main/res/drawable/actionbar_search_bg.xml
+++ b/app/src/main/res/drawable/actionbar_search_bg.xml
@@ -1,9 +1,9 @@
-
+
-
+
-
+
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fm_search_history_item.xml b/app/src/main/res/layout/fm_search_history_item.xml
index 4fbbf05e86..4701e1c563 100644
--- a/app/src/main/res/layout/fm_search_history_item.xml
+++ b/app/src/main/res/layout/fm_search_history_item.xml
@@ -1,29 +1,27 @@
-
+
+ android:id="@+id/search_history_line"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_marginLeft="16dp"
+ android:layout_marginRight="16dp"
+ android:background="@color/text_F5F5F5" />
-
-
+ android:id="@+id/search_history_name"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:ellipsize="end"
+ android:gravity="center_vertical"
+ android:padding="16dp"
+ android:singleLine="true"
+ android:textColor="@color/bg_303030"
+ android:textSize="14sp" />
+
diff --git a/app/src/main/res/layout/fragment_search_default.xml b/app/src/main/res/layout/fragment_search_default.xml
index 5f97472ea5..f79380e696 100644
--- a/app/src/main/res/layout/fragment_search_default.xml
+++ b/app/src/main/res/layout/fragment_search_default.xml
@@ -25,16 +25,12 @@
visibleGone="@{isExistHistory}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
android:background="@android:color/white"
android:includeFontPadding="false"
- android:paddingLeft="20dp"
- android:paddingTop="16dp"
- android:paddingRight="20dp"
- android:paddingBottom="16dp"
+ android:padding="16dp"
android:text="@string/search_history"
- android:textColor="@color/black"
- android:textSize="15sp"
+ android:textColor="@color/text_0E0E0E"
+ android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -44,11 +40,12 @@
visibleGone="@{isExistHistory}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginRight="20dp"
+ android:layout_marginRight="16dp"
android:drawableLeft="@drawable/search_history_delete"
- android:drawablePadding="8dp"
- android:text="@string/search_history_clean"
+ android:drawablePadding="4dp"
+ android:textColor="@color/text_999999"
android:textSize="12sp"
+ android:text="@string/search_history_clean"
app:layout_constraintBottom_toBottomOf="@id/history_title"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/history_title" />
@@ -65,8 +62,7 @@
visibleGone="@{isExistHistory}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="20dp"
- android:paddingBottom="5dp"
+ android:paddingLeft="16dp"
app:flexWrap="wrap" />
@@ -75,16 +71,12 @@
visibleGone="@{isExistHotTag}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
android:background="@android:color/white"
android:includeFontPadding="false"
- android:paddingLeft="20dp"
- android:paddingTop="16dp"
- android:paddingRight="20dp"
- android:paddingBottom="16dp"
+ android:padding="16dp"
android:text="@string/search_hot_tag"
- android:textColor="@color/black"
- android:textSize="15sp"
+ android:textColor="@color/text_0E0E0E"
+ android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/history_flex_container" />
@@ -101,8 +93,7 @@
visibleGone="@{isExistHotTag}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingLeft="20dp"
- android:paddingBottom="7dp"
+ android:paddingLeft="16dp"
app:flexWrap="wrap" />
@@ -111,16 +102,12 @@
visibleGone="@{isExistHotSearch}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
android:background="@android:color/white"
android:includeFontPadding="false"
- android:paddingLeft="20dp"
- android:paddingTop="16dp"
- android:paddingRight="20dp"
- android:paddingBottom="11dp"
+ android:padding="16dp"
android:text="@string/search_hot"
- android:textColor="@color/black"
- android:textSize="15sp"
+ android:textColor="@color/text_0E0E0E"
+ android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/hot_tag_flex_container" />
diff --git a/app/src/main/res/layout/fragment_tags.xml b/app/src/main/res/layout/fragment_tags.xml
index fec4630e35..b518d6c427 100644
--- a/app/src/main/res/layout/fragment_tags.xml
+++ b/app/src/main/res/layout/fragment_tags.xml
@@ -8,11 +8,10 @@
android:id="@+id/tags_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="8dp"
android:background="@color/all_white"
android:clipToPadding="false"
android:paddingLeft="20dp"
- android:paddingTop="16dp"
+ android:paddingTop="8dp"
android:paddingRight="12dp"
android:paddingBottom="8dp" />
@@ -32,11 +31,18 @@
android:layout_height="wrap_content"
android:visibility="gone" />
+
+
+ android:layout_below="@id/divider">
+ android:paddingRight="16dp">
+ android:paddingLeft="16dp"
+ android:paddingBottom="16dp">
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/toolbar_search.xml b/app/src/main/res/layout/toolbar_search.xml
index 05a49a9d6d..e39d75e80d 100644
--- a/app/src/main/res/layout/toolbar_search.xml
+++ b/app/src/main/res/layout/toolbar_search.xml
@@ -2,14 +2,14 @@
+ android:layout_width="44dp"
+ android:layout_height="match_parent">
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 7d316dd335..218728bf53 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -212,6 +212,7 @@
#06CCF4
#F8A142
#757575
+ #0E0E0E
#99666666
From db0e92fd683d9309ee12a66ca4997bdb58f15678 Mon Sep 17 00:00:00 2001
From: lyr <15622190878@163.com>
Date: Fri, 20 Nov 2020 14:38:02 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=89=E7=8E=AF?=
=?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=EF=BC=88?=
=?UTF-8?q?2020=E5=B9=B411=E6=9C=88=E7=AC=AC1=E5=91=A8=EF=BC=898(1)?=
=?UTF-8?q?=E3=80=819=E3=80=8110=20https://gitlab.ghzs.com/pm/halo-app-iss?=
=?UTF-8?q?ues/-/issues/1057?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/com/gh/gamecenter/personalhome/UserHomeFragment.kt | 2 +-
.../java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java | 2 +-
app/src/main/res/layout/game_item.xml | 2 +-
app/src/main/res/values/strings.xml | 2 +-
4 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt
index d215037396..d4246f3c25 100644
--- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt
+++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt
@@ -273,7 +273,7 @@ class UserHomeFragment : NormalFragment() {
?: UserVideoHistoryFragment.getInstance(mUserHomeViewModel.userId, count)
val fragmentList = listOf(commentFragment, qaFragment, videoFragment)
- val titleList = listOf("游戏评论", "问答", "视频")
+ val titleList = listOf("游戏评论", "我的论坛", "视频")
val countList = listOf(count.gameComment, count.getQaCount(), count.video)
viewpager.offscreenPageLimit = fragmentList.size
diff --git a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java
index cfa97d81f6..800b729c1e 100644
--- a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java
+++ b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java
@@ -44,7 +44,7 @@ public class MyAskWrapperFragment extends BaseFragment_TabLayout {
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
- setNavigationTitle(R.string.myask);
+ setNavigationTitle(R.string.my_forum);
initMenu(R.menu.menu_my_ask_wrapper);
}
diff --git a/app/src/main/res/layout/game_item.xml b/app/src/main/res/layout/game_item.xml
index 96d3bb5628..098f6eea86 100644
--- a/app/src/main/res/layout/game_item.xml
+++ b/app/src/main/res/layout/game_item.xml
@@ -154,7 +154,7 @@
android:drawablePadding="4dp"
android:includeFontPadding="false"
android:paddingRight="@{game.commentCount > 3?DisplayUtils.dip2px(8F): 0}"
- android:text="@{game.commentCount > 3?game.star + ``: ``}"
+ android:text="@{game.commentCount > 3?(game.star == 10.0? `10` : game.star + ``): ``}"
android:textColor="@{Color.parseColor(game.commentCount > 3?`#1383EB`:`#2496FF`)}"
android:textStyle="bold"
android:visibility="gone" />
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1d93b248eb..b58affb6fa 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -553,7 +553,7 @@
我的问答
我的草稿
我的积分
- 我的问答
+ 我的论坛
已关注
回答为什么折叠?
继续撰写