You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中RecyclerView点击跳转及任务分类显示异常求助

安卓任务管理应用问题解决方案

问题一:RecyclerView点击跳转Activity的修正

你的代码已实现跳转逻辑,但存在控件复用错误,修正方案如下:

  1. 修复Holder控件绑定问题
    当前Holder直接使用全局binding会导致列表项复用混乱,改为通过itemView绑定或传递binding到Holder:

    // 方案1:通过itemView获取控件
    inner class HolderCategory(itemView: View): RecyclerView.ViewHolder(itemView){
        var categoryTv: TextView = itemView.findViewById(R.id.categoryTV)
        var deleteButton: ImageButton = itemView.findViewById(R.id.deleteButton)
    }
    
    // 方案2:传递binding到Holder
    inner class HolderCategory(val binding: RowLayoutBinding): RecyclerView.ViewHolder(binding.root)
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HolderCategory {
        val binding = RowLayoutBinding.inflate(LayoutInflater.from(context), parent, false)
        return HolderCategory(binding)
    }
    
  2. 优化跳转逻辑
    直接使用当前position的model数据传递参数,避免重复获取列表项:

    holder.categoryTv.setOnClickListener {
        val intent = Intent(context, TaskListActivity::class.java)
        intent.putExtra("categoryID", model.id) // 优先传递ID,比标题更可靠
        intent.putExtra("categoryTitle", model.category)
        context.startActivity(intent)
    }
    

问题二:任务跨类别显示的解决

任务跨类别显示的核心原因是加载任务时未按类别过滤,需从数据结构、任务创建、任务加载三方面修正:

1. 调整任务数据结构

给任务Model添加categoryId字段,关联所属类别:

class TaskModel {
    var id: String = ""
    var title: String = ""
    var categoryId: String = "" // 新增:绑定所属类别ID
    var dateCreated: Long = 0
    var uid: String = ""

    constructor(id: String, title: String, categoryId: String, dateCreated: Long, uid: String) {
        this.id = id
        this.title = title
        this.categoryId = categoryId
        this.dateCreated = dateCreated
        this.uid = uid
    }
}

2. 创建任务时关联类别

在新建任务的页面(NewTaskActivity)中,接收跳转传递的categoryID,并在保存任务时写入该字段:

// 获取跳转传递的类别ID
val categoryId = intent.getStringExtra("categoryID") ?: ""

// 保存任务到Firebase时
val dateCreated = System.currentTimeMillis()
val hashMap = HashMap<String, Any>()
hashMap["id"] = "$dateCreated"
hashMap["title"] = taskTitle
hashMap["categoryId"] = categoryId // 关联所属类别
hashMap["created"] = dateCreated
hashMap["uid"] = firebaseAuth.uid ?: ""

3. 按类别加载任务

创建TaskListActivity,专门展示指定类别的任务,通过类别ID过滤数据:

class TaskListActivity : AppCompatActivity() {
    private lateinit var taskArrayList: ArrayList<TaskModel>
    private lateinit var adapterTask: AdapterTask
    private var categoryId = ""

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityTaskListBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 获取传递的类别ID
        categoryId = intent.getStringExtra("categoryID") ?: ""
        loadTasksByCategory()
    }

    private fun loadTasksByCategory() {
        taskArrayList = ArrayList()
        val ref = FirebaseDatabase.getInstance().getReference("Tasks")
        // 过滤当前类别ID的任务
        ref.orderByChild("categoryId").equalTo(categoryId)
            .addValueEventListener(object : ValueEventListener {
                override fun onDataChange(snapshot: DataSnapshot) {
                    taskArrayList.clear()
                    for (ds in snapshot.children) {
                        val model = ds.getValue(TaskModel::class.java)
                        model?.let { taskArrayList.add(it) }
                    }
                    adapterTask = AdapterTask(this@TaskListActivity, taskArrayList)
                    binding.tasksRV.adapter = adapterTask
                }

                override fun onCancelled(error: DatabaseError) {}
            })
    }
}

4. 修正类别跳转目标

把原跳转NewTaskActivity改为跳转TaskListActivity,实现点击类别进入对应任务列表:

holder.categoryTv.setOnClickListener {
    val intent = Intent(context, TaskListActivity::class.java)
    intent.putExtra("categoryID", model.id)
    intent.putExtra("categoryTitle", model.category)
    context.startActivity(intent)
}

额外优化:过滤当前用户的类别

当前加载类别会显示所有用户的内容,添加用户ID过滤:

private fun loadCategories() {
    categoryArrayList = ArrayList()
    val ref = FirebaseDatabase.getInstance().getReference("Categories")
    // 仅加载当前用户的类别
    ref.orderByChild("uid").equalTo(firebaseAuth.uid)
        .addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                categoryArrayList.clear()
                for (ds in snapshot.children) {
                    val model = ds.getValue(ModelClass::class.java)
                    model?.let { categoryArrayList.add(it) }
                }
                adapterCategory = AdapterCategory(this@Categories, categoryArrayList)
                binding.categoriesRV.adapter = adapterCategory
            }

            override fun onCancelled(error: DatabaseError) {}
        })
}

内容的提问来源于stack exchange,提问作者Skha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:15:30