当只有一项时,RecyclerView 是否绝对错误?

Is the RecyclerView absolutely wrong when there is only one item?

我正在制作一个看起来像图像的函数。

虽然图中没有显示,但可以通过按钮添加或删除这些项目。

项目由HeaderDetail组成。适配器也分别有HeaderAdapterDetailAdapter

我正在使用 ConcatAdapter 来确保每个组有 HeaderAdapterDetailAdatper,而不是整个列表。

因为我认为它比在 one adapter 中使用 multiview types 更易于管理(纯粹是我的意见)。

但是我有一个问题。 HeaderAdapter.

从图中可以看出,每组有 one header 个。所以,每组HeaderAdapter中一定只有一个HeaderItem

在这种情况下,我认为没有太多理由使用适配器。

就我而言,使用 multiview type 代替 one Adapter 更好吗?

RoutineItem

sealed class RoutineItem(
    val layoutId: Int
) {
    data class Header(
        val id: String = "1",
        val workout: String = "2",
        val unit: String = "3",
    ) : RoutineItem(VIEW_TYPE) {
        companion object {
            const val VIEW_TYPE = R.layout.routine_item
        }
    }
    data class Detail(
        val id: String = UUID.randomUUID().toString(), // UUID
        val set: Int = 1,
        var weight: String ="",
        val reps: String = "1"
    ) : RoutineItem(VIEW_TYPE) {
        companion object {
            const val VIEW_TYPE = R.layout.item_routine_detail
        }
    }
}

HeaderAdapter

class HeaderAdapter(item: RoutineItem.Header) : BaseAdapter<RoutineItem.Header>(initialItem = listOf(item)) {

    override fun createViewHolder(itemView: View): GenericViewHolder<RoutineItem.Header> {
        return HeaderViewHolder(itemView)
    }

    override fun getItemCount(): Int = 1

    class HeaderViewHolder(itemView: View) : GenericViewHolder<RoutineItem.Header>(itemView)
}

细节适配器

class DetailAdapter(private val items: List<RoutineItem.Detail> = emptyList())
    : BaseAdapter<RoutineItem.Detail>(initialItem = items) {

    override fun createViewHolder(itemView: View): GenericViewHolder<RoutineItem.Detail> {
        return DetailViewHolder(itemView)
    }

    override fun getItemCount(): Int = items.size

    class DetailViewHolder(itemView: View) : GenericViewHolder<RoutineItem.Detail>(itemView)
}

Activity

class MainActivity : AppCompatActivity() {
    var concatAdpater: ConcatAdapter = ConcatAdapter()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val rv: RecyclerView = findViewById(R.id.rv)

        val adapterItems: ArrayList<Pair<RoutineItem.Header, List<RoutineItem.Detail>>> = arrayListOf()
        val childItems : List<RoutineItem.Detail> = listOf(
            RoutineItem.Detail(),
            RoutineItem.Detail(),
            RoutineItem.Detail(),
            RoutineItem.Detail(),
            RoutineItem.Detail()
        )

        adapterItems.add(Pair(RoutineItem.Header(), childItems))
        adapterItems.add(Pair(RoutineItem.Header(), childItems))
        adapterItems.add(Pair(RoutineItem.Header(), childItems))
        for ((header, list) in adapterItems) { // 1 adapter per group
            concatAdpater.addAdapter(HeaderAdapter(header))
            concatAdpater.addAdapter(DetailAdapter(list))
        }
        rv.adapter = concatAdpater
    }
}

因为是测试代码,所以有些部分没有实现功能! (例如,动态添加和删除项目..)

使用单个适配器总是更好,因为 DiffUtil 更易于管理项目动画和状态更改。此外,它更易于维护且效率更高(在速度和资源管理方面)。

更详细的回答: