【问题标题】:Sort the items of an RecyclerView - Kotlin Code对 RecyclerView 的项目进行排序 - Kotlin 代码
【发布时间】:2020-12-09 12:44:46
【问题描述】:

我有一个数据类,其中包含一个名为“prio”的成员(下面的示例)。这个“prio”应该创建 recyclerView 显示项目的顺序 -> 数字 1 的“prio”应该显示在 rv 的顶部,数字 2 应该显示在数字 1 的下方,依此类推。

附加信息:但用户可以决定项目应该有哪个数字(优先)。所以“prio”是不固定的。

数据类

data class TaskModel(

val id: Int,
val task: String,
var prio: Int
)

问题:您能否帮我创建一个函数来对“prio”进行排序,并按照 recyclerView 显示项目的顺序在 recyclerView 中初始化该函数?

附件:

适配器:

open class TaskAdapter (private val context: Context, private val list: ArrayList<TaskModel>)
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {

private val mTaskDetails : TaskModel? = null


private var onClickListener: OnClickListener? = null

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
    return MyViewHolder(
        LayoutInflater.from(context).inflate(R.layout.activity_item_adapter, parent, false)
    )
}

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

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
    val model = list[position]


    if (holder is MyViewHolder) {
        holder.itemView.tv_task_name.text = model.task

        if(model.prio == 1){
            holder.itemView.tv_priority.setBackgroundColor(Color.parseColor("#DF0101"))

        }else if (model.prio == 2){
            holder.itemView.tv_priority.setBackgroundColor(Color.parseColor("#FFFF00"))

        }else if (model.prio == 3){
            holder.itemView.tv_priority.setBackgroundColor(Color.parseColor("#31B404"))
        }

        //holder.itemView.tv_priority.text = model.prio

        holder.itemView.setOnClickListener{
            if(onClickListener != null){
                onClickListener!!.onClick(position,model)
            }
        }
    }


}
private class MyViewHolder(view: View) : RecyclerView.ViewHolder(view)

//RecyclerView Klickbar machen
interface OnClickListener {
    fun onClick(position: Int, model: TaskModel)
}

MainActivity

 private fun setupTaskRecyclerView(tasklist: ArrayList<TaskModel>){
    rv_task_view.layoutManager = LinearLayoutManager(this)
    rv_task_view.setHasFixedSize(true)

    val taskAdapter = TaskAdapter(this, tasklist)
    rv_task_view.adapter = taskAdapter
 }

【问题讨论】:

  • 在将任务列表添加到适配器之前,请确保已经对它们进行了排序。创建 taskList 的副本并创建一个 sortedTaskList 变量,您可以在其中按优先级添加 taskList。希望这会有所帮助。

标签: android sorting kotlin android-recyclerview


【解决方案1】:

你可以在传递给adapter之前sort你的array如下:

tasklist.sortBy { it.prio }

您的代码将更改如下:

 private fun setupTaskRecyclerView(tasklist: ArrayList<TaskModel>){
    rv_task_view.layoutManager = LinearLayoutManager(this)
    rv_task_view.setHasFixedSize(true)

    tasklist.sortBy { it.prio }
    val taskAdapter = TaskAdapter(this, tasklist)
    rv_task_view.adapter = taskAdapter
   
   }

【讨论】:

  • 非常感谢!但是,如果我将 tasklist.sortBy { it.prio } 放入 TaskAdapter,则会出现此错误:类型推断失败。预期类型不匹配:必需:kotlin.collections.ArrayList /* = java.util.ArrayList */ found: Unit 也许你有解决这个问题的办法?
  • 使用sortedBy 而不是sortBy。第一个返回一个新的排序列表,而最后一个排序源列表。
  • @JeneaVranceanu - 这也不错
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多