|
|
@@ -8,6 +8,7 @@ import com.adealink.frame.base.fastLazy
|
|
|
import com.adealink.frame.ext.isViewBindingValid
|
|
|
import com.adealink.frame.mvvm.view.viewBinding
|
|
|
import com.adealink.frame.router.Router
|
|
|
+import com.adealink.frame.util.DisplayUtil
|
|
|
import com.adealink.weparty.R
|
|
|
import com.adealink.weparty.commonui.BaseFragment
|
|
|
import com.adealink.weparty.commonui.ext.dp
|
|
|
@@ -20,12 +21,16 @@ import com.adealink.weparty.module.category.data.CategoryAction
|
|
|
import com.adealink.weparty.module.joinus.JoinUs
|
|
|
import com.adealink.weparty.module.playmate.Playmate
|
|
|
import com.adealink.weparty.module.playmate.PlaymateModule
|
|
|
+import com.adealink.weparty.ui.category.adapter.CategoryListBottomViewBinder
|
|
|
import com.adealink.weparty.ui.category.adapter.CategoryListItemViewBinder
|
|
|
import com.adealink.weparty.ui.category.adapter.CategoryListTitleViewBinder
|
|
|
import com.adealink.weparty.ui.category.adapter.CategoryTabTitleViewBinder
|
|
|
import com.adealink.weparty.ui.category.data.CategoryItemData
|
|
|
+import com.adealink.weparty.ui.category.data.CategoryListBottomData
|
|
|
import com.adealink.weparty.ui.category.data.CategoryListItemData
|
|
|
import com.adealink.weparty.ui.category.data.CategoryListTitleData
|
|
|
+import kotlin.math.max
|
|
|
+
|
|
|
|
|
|
class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
|
|
|
@@ -103,11 +108,6 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
binding.rvTab.addItemDecoration(
|
|
|
VerticalSpaceItemDecoration(24.dp())
|
|
|
)
|
|
|
- binding.rvTab.addOnScrollListener(object : RecyclerView.OnScrollListener() {
|
|
|
- override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
|
|
|
-
|
|
|
- }
|
|
|
- })
|
|
|
}
|
|
|
|
|
|
private fun initList() {
|
|
|
@@ -116,11 +116,14 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
listAdapter.register(CategoryListItemViewBinder { item, position ->
|
|
|
selectItem(item)
|
|
|
})
|
|
|
+ listAdapter.register(CategoryListBottomViewBinder())
|
|
|
listLayoutManger = GridLayoutManager(context, SPAN_COUNT, RecyclerView.VERTICAL, false)
|
|
|
listLayoutManger.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
|
|
|
override fun getSpanSize(position: Int): Int {
|
|
|
val data = listAdapter.items.getOrNull(position)
|
|
|
- if (data is CategoryListTitleData) {
|
|
|
+ if (data is CategoryListTitleData
|
|
|
+ || data is CategoryListBottomData
|
|
|
+ ) {
|
|
|
return SPAN_COUNT
|
|
|
}
|
|
|
return 1
|
|
|
@@ -153,7 +156,14 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
if (toPosition != null && toPosition >= 0) {
|
|
|
updateTitleTab(selectPosition)
|
|
|
skipScrollTitle = true
|
|
|
- listLayoutManger.scrollToPosition(toPosition)
|
|
|
+ listLayoutManger.scrollToPositionWithOffset(
|
|
|
+ toPosition,
|
|
|
+ if (toPosition == 0) {
|
|
|
+ 0
|
|
|
+ } else {
|
|
|
+ (-48).dp()
|
|
|
+ }
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -171,7 +181,7 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
val titlePosition = itemToTitlePosition.getOrNull(position)
|
|
|
if (titlePosition != null && titlePosition >= 0) {
|
|
|
updateTitleTab(titlePosition)
|
|
|
- titleLayoutManger.scrollToPosition(titlePosition)
|
|
|
+ titleLayoutManger.scrollToPositionWithOffset(position, 0)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -196,11 +206,19 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
}
|
|
|
titlePosition++
|
|
|
titleList.add(CategoryListTitleData(data))
|
|
|
-
|
|
|
+ itemList.add(
|
|
|
+ CategoryListTitleData(
|
|
|
+ data,
|
|
|
+ marginTop = if (titlePosition == 0) {
|
|
|
+ 0
|
|
|
+ } else {
|
|
|
+ 48.dp()
|
|
|
+ }
|
|
|
+ )
|
|
|
+ )
|
|
|
itemToTitlePosition.add(titlePosition)
|
|
|
- itemList.add(CategoryListTitleData(data))
|
|
|
+ titleToItemPosition.add(itemList.size - 1)
|
|
|
|
|
|
- titleToItemPosition.add(itemList.size + 1)
|
|
|
for (subData in data.subCategoryList) {
|
|
|
if (isHidden(listOf(subData.code))) {
|
|
|
continue
|
|
|
@@ -209,6 +227,7 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
itemList.add(CategoryListItemData(data.code, subData))
|
|
|
}
|
|
|
}
|
|
|
+ itemList.add(CategoryListBottomData(DisplayUtil.getScreenHeight()))
|
|
|
submitCategoryList(titleList, itemList)
|
|
|
}
|
|
|
}
|
|
|
@@ -229,7 +248,39 @@ class CategoryFragment : BaseFragment(R.layout.fragment_category) {
|
|
|
this.titleList = titleList
|
|
|
titleAdapter.submitList(titleList)
|
|
|
this.itemList = itemList
|
|
|
- listAdapter.submitList(itemList)
|
|
|
+ listAdapter.submitList(itemList, committed = {
|
|
|
+ calcBottomSpace(titleList, itemList)
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun calcBottomSpace(
|
|
|
+ titleList: List<CategoryListTitleData>,
|
|
|
+ itemList: List<CategoryItemData>
|
|
|
+ ) {
|
|
|
+ binding.rvList.post {
|
|
|
+ if (isViewBindingValid()) {
|
|
|
+ val lastTab = titleList.lastOrNull() ?: return@post
|
|
|
+ var lastTabHeight = 0
|
|
|
+ if (titleList.size > 1) {
|
|
|
+ lastTabHeight += (36 + 48).dp()
|
|
|
+ } else {
|
|
|
+ lastTabHeight += 36.dp()
|
|
|
+ }
|
|
|
+
|
|
|
+ val line = if (lastTab.data.subCategoryList.size % SPAN_COUNT == 0) {
|
|
|
+ lastTab.data.subCategoryList.size / SPAN_COUNT
|
|
|
+ } else {
|
|
|
+ (lastTab.data.subCategoryList.size + SPAN_COUNT) / SPAN_COUNT
|
|
|
+ }
|
|
|
+ lastTabHeight += line * 66.dp() + max(line - 1, 0) * 10.dp()
|
|
|
+
|
|
|
+ val bottomItem = itemList.lastOrNull()
|
|
|
+ if (bottomItem is CategoryListBottomData) {
|
|
|
+ bottomItem.height = max(binding.rvList.height - lastTabHeight, 0)
|
|
|
+ listAdapter.notifyItemChanged(itemList.size - 1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
private fun selectItem(item: CategoryListItemData) {
|