用Kotlin写一个适配空列表情况的RecyclerView Adapter

Writing a RecyclerView Adapter in Kotlin adaptable to empty list situation

我正在处理一个在 RecyclerView 上查看的动态列表。到目前为止,可以添加和删除元素。用户还可以通过多个 popUpWindows 更改每个元素的内容。但是,MyViewHolder class 由于 onClickListener 很多而变得很长。所以我将 MyRecyclerViewAdapter class 放在一个单独的文件中,与 activity 的其余部分分开。现在,

  1. 保持 MyViewHolder class 长且有许多点击侦听器(在 Adapter 对象内完成大部分工作)是一个好习惯,还是我应该检索来自 MyRecyclerViewAdapter 的相关数据并在 onCreate 部分中执行 'delete, add, edit text' 工作?

  2. 在删除所有元素时显示全新和不同视图的最有效、简单和快速的解决方案是什么?我尝试了 VISIBLE, GONE 解决方案,但 MyAdapter 在一个单独的文件中,我不知道如何与 onCreate 部分通信以传输动态列表的实时大小。

1/ 如果您的操作是关于与列表中的项目组件交互(添加、删除、编辑、获取内容...),您应该将函数放在 Adapter 中,单击 ViewHolder 应该只给出它的位置适配器。此处的解决方案:

2/ 为什么使用 VISIBLE, GONE ?当您删除一个项目时,这意味着您删除了数据列表中的项目,因此只需在之后重新加载视图,适配器将自动显示剩余数据

答案:

问题 1:Kiet Phan 关于在 onBindViewHolder 函数中携带逻辑部分的建议很有帮助。

问题 2:如果您已经将当前上下文传递给单独 class 的主构造函数(在另一个文件中定义),则在 Kotlin 中可以通过代码段:(context as Activity)

所以我的适配器的解决方案和一般结构是这样的:

 import ...

 class MyAdapter (var ctx: Context, var list: ArrayList<SomeObject>)
    : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyAdapter.MyViewHolder {
    return MyViewHolder(LayoutInflater.from(ctx).inflate(R.layout.singleListElement, parent,false))
    }

    override fun getItemCount(): Int {
    return list.size
    }

    override fun onBindViewHolder(holder: MyAdapter.MyViewHolder, position: Int) {

    //Do the work here, onClickListeners, if statements etc.
    //...
    list.remove(index)
    if(list.size == 0) {
    (ctx as Activity).findViewById<TextView>(R.id.listEmpty).visibility=View.VISIBLE
       }
    } //Close onBindViewHolder

    inner class MyViewHolder (v: View) : RecyclerView.ViewHolder(v){

      val someView: Textview
      init { someView = v.findViewById(R.id.someViewId) }
    }  
}  

写代码到这个window并不容易。当我按下 Tab 按钮时,浏览器退出编辑屏幕并选择该网页的另一部分。所以代码看起来像这样。也许 Copy/Paste 会做得更好。

欢迎针对空列表情况进行改进和更有效的解决方案。谢谢。