From 2dc819f9167fd09f9cfd9f2bf63688b56bed4469 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Mon, 8 Dec 2025 18:51:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=83=E7=B4=A0adapter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vididin/features/zero/ZeroBuyActivity.kt | 17 +- .../vididin/features/zero/ZeroItemAdapter.kt | 42 +++++ app/src/main/res/layout/activity_zerobuy.xml | 132 +------------- .../main/res/layout/layout_item_zerobuy.xml | 118 ++++++++++++ .../architecture/util/CommonItemDecoration.kt | 171 ++++++++++++++++++ 5 files changed, 350 insertions(+), 130 deletions(-) create mode 100644 app/src/main/java/com/gamedog/vididin/features/zero/ZeroItemAdapter.kt create mode 100644 app/src/main/res/layout/layout_item_zerobuy.xml create mode 100644 core/architecture/src/main/java/com/ama/core/architecture/util/CommonItemDecoration.kt diff --git a/app/src/main/java/com/gamedog/vididin/features/zero/ZeroBuyActivity.kt b/app/src/main/java/com/gamedog/vididin/features/zero/ZeroBuyActivity.kt index 6ababed..6b7de25 100644 --- a/app/src/main/java/com/gamedog/vididin/features/zero/ZeroBuyActivity.kt +++ b/app/src/main/java/com/gamedog/vididin/features/zero/ZeroBuyActivity.kt @@ -7,7 +7,9 @@ import androidx.activity.viewModels import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import androidx.recyclerview.widget.GridLayoutManager import com.ama.core.architecture.appBase.AppViewsEmptyViewModelActivity +import com.ama.core.architecture.util.CommonItemDecoration import com.ama.core.architecture.util.setOnClickBatch import com.gamedog.vididin.R import com.gamedog.vididin.beans.ZeroBuyResp @@ -24,6 +26,9 @@ import com.gamedog.vididin.databinding.ActivityZerobuyBinding as ViewBinding @AndroidEntryPoint class ZeroBuyActivity : AppViewsEmptyViewModelActivity() { private val viewModel: ZeroBuyViewModel by viewModels() + private lateinit var mAdapter: ZeroItemAdapter + + override fun inflateViewBinding(inflater: LayoutInflater) = ViewBinding.inflate(inflater) @@ -46,6 +51,16 @@ class ZeroBuyActivity : AppViewsEmptyViewModelActivity() { titlebar.addRightIcon(R.mipmap.icon_question_mark, { showHintInfo() }) + + + with(recyclerView) { + mAdapter = ZeroItemAdapter() + adapter = mAdapter + layoutManager = GridLayoutManager(this@ZeroBuyActivity, 2) + addItemDecoration( + CommonItemDecoration.create(horizontalSpace = 45, verticalSpace = 45) + ) + } } @@ -95,7 +110,7 @@ class ZeroBuyActivity : AppViewsEmptyViewModelActivity() { private fun updateUIs(data: ZeroBuyResp) { - + mAdapter.submitList(data.mCurrentList) } diff --git a/app/src/main/java/com/gamedog/vididin/features/zero/ZeroItemAdapter.kt b/app/src/main/java/com/gamedog/vididin/features/zero/ZeroItemAdapter.kt new file mode 100644 index 0000000..12c4f24 --- /dev/null +++ b/app/src/main/java/com/gamedog/vididin/features/zero/ZeroItemAdapter.kt @@ -0,0 +1,42 @@ +package com.gamedog.vididin.features.zero + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.gamedog.vididin.beans.ZeroBuyItem +import com.gamedog.vididin.databinding.LayoutItemZerobuyBinding as ViewBinding + +class ZeroItemAdapter : ListAdapter(DiffCallback()) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val binding = ViewBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(getItem(position)) + } + + inner class ViewHolder(private val binding: ViewBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: ZeroBuyItem) { + /*binding.tvDate.text = transaction.dateTime + binding.tvTitle.text = transaction.statusText + binding.tvDescription.text = transaction.description + binding.tvAmount.text = transaction.amount + binding.tvAmount.setTextColor(ContextCompat.getColor(binding.root.context, transaction.amountColor)) +*/ + } + } + + class DiffCallback : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: ZeroBuyItem, newItem: ZeroBuyItem): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: ZeroBuyItem, newItem: ZeroBuyItem): Boolean { + return oldItem == newItem + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_zerobuy.xml b/app/src/main/res/layout/activity_zerobuy.xml index e612591..8f59d24 100644 --- a/app/src/main/res/layout/activity_zerobuy.xml +++ b/app/src/main/res/layout/activity_zerobuy.xml @@ -89,137 +89,11 @@ > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/CommonItemDecoration.kt b/core/architecture/src/main/java/com/ama/core/architecture/util/CommonItemDecoration.kt new file mode 100644 index 0000000..71fbe3f --- /dev/null +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/CommonItemDecoration.kt @@ -0,0 +1,171 @@ +package com.ama.core.architecture.util + +import android.content.Context +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager + +class CommonItemDecoration private constructor( + private val horizontalSpace: Int, + private val verticalSpace: Int, + private val includeEdge: Boolean +) : RecyclerView.ItemDecoration() { + + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + + val position = parent.getChildAdapterPosition(view) + val adapter = parent.adapter ?: return + val itemCount = adapter.itemCount + + when (val layoutManager = parent.layoutManager) { + is GridLayoutManager -> { + handleGridLayout(outRect, position, itemCount, layoutManager) + } + is LinearLayoutManager -> { + handleLinearLayout(outRect, position, itemCount, layoutManager) + } + is StaggeredGridLayoutManager -> { + handleStaggeredGridLayout(outRect, position, itemCount, layoutManager) + } + } + } + + private fun handleGridLayout( + outRect: Rect, + position: Int, + itemCount: Int, + layoutManager: GridLayoutManager + ) { + val spanCount = layoutManager.spanCount + val orientation = layoutManager.orientation + + if (orientation == GridLayoutManager.VERTICAL) { + // 垂直网格布局 + val column = position % spanCount + + if (includeEdge) { + outRect.left = horizontalSpace * (spanCount - column) / spanCount + outRect.right = horizontalSpace * (column + 1) / spanCount + + if (position < spanCount) { + outRect.top = verticalSpace + } + outRect.bottom = verticalSpace + } else { + outRect.left = horizontalSpace * column / spanCount + outRect.right = horizontalSpace * (spanCount - 1 - column) / spanCount + + if (position >= spanCount) { + outRect.top = verticalSpace + } + } + } else { + // 水平网格布局 + val row = position % spanCount + + if (includeEdge) { + outRect.top = verticalSpace * (spanCount - row) / spanCount + outRect.bottom = verticalSpace * (row + 1) / spanCount + + if (position < spanCount) { + outRect.left = horizontalSpace + } + outRect.right = horizontalSpace + } else { + outRect.top = verticalSpace * row / spanCount + outRect.bottom = verticalSpace * (spanCount - 1 - row) / spanCount + + if (position >= spanCount) { + outRect.left = horizontalSpace + } + } + } + } + + private fun handleLinearLayout( + outRect: Rect, + position: Int, + itemCount: Int, + layoutManager: LinearLayoutManager + ) { + when (layoutManager.orientation) { + LinearLayoutManager.VERTICAL -> { + // 垂直线性布局 + outRect.left = horizontalSpace + outRect.right = horizontalSpace + + if (position == 0 && includeEdge) { + outRect.top = verticalSpace + } + + if (includeEdge) { + outRect.bottom = verticalSpace + } else { + outRect.bottom = if (position == itemCount - 1) 0 else verticalSpace + } + } + LinearLayoutManager.HORIZONTAL -> { + // 水平线性布局 + outRect.top = verticalSpace + outRect.bottom = verticalSpace + + if (position == 0 && includeEdge) { + outRect.left = horizontalSpace + } + + if (includeEdge) { + outRect.right = horizontalSpace + } else { + outRect.right = if (position == itemCount - 1) 0 else horizontalSpace + } + } + } + } + + private fun handleStaggeredGridLayout( + outRect: Rect, + position: Int, + itemCount: Int, + layoutManager: StaggeredGridLayoutManager + ) { + outRect.left = horizontalSpace / 2 + outRect.right = horizontalSpace / 2 + outRect.top = verticalSpace / 2 + outRect.bottom = verticalSpace / 2 + } + + companion object { + fun create( + horizontalSpace: Int, + verticalSpace: Int, + includeEdge: Boolean = true + ): CommonItemDecoration { + return CommonItemDecoration(horizontalSpace, verticalSpace, includeEdge) + } + + fun createFromDp( + horizontalSpaceDp: Int, + verticalSpaceDp: Int, + context: Context, + includeEdge: Boolean = true + ): CommonItemDecoration { + val horizontalSpacePx = dpToPx(horizontalSpaceDp, context) + val verticalSpacePx = dpToPx(verticalSpaceDp, context) + return CommonItemDecoration(horizontalSpacePx, verticalSpacePx, includeEdge) + } + + private fun dpToPx(dp: Int, context: Context): Int { + val density = context.resources.displayMetrics.density + return (dp * density + 0.5f).toInt() + } + } +} \ No newline at end of file