Recycler View 回调活动

2024-02-23

我正在尝试为单个回收器视图项目实现单击侦听器,并使用单击的数据(单个借用者)从我的活动中运行方法。

怎么处理呢?我是 kotlin 新手,所以分步指导将会非常有帮助:)

Thanks!

主要活动:

val db by lazy { Database.getInstance(applicationContext).database }

fun startDebtActivity() {
    val intent = Intent(this, AddDebtActivity::class.java)
    startActivity(intent)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    addDebtBtn.setOnClickListener {
        startDebtActivity()
    }

    thread {
        var borrowers = db.borrowers()
            .getAll()

        runOnUiThread {
            val debtsSum = borrowers.sumByDouble { it.debt }

            // update sum of debts
            summary.text = debtsSum?.toBigDecimal().setScale(2, 2).toString()
            // update item list
            recycler.apply {
                layoutManager = LinearLayoutManager(this@MainActivity)
                adapter = BorrowersListAdapter(borrowers)
            }
        }
    }
}

Adapter:

class BorrowersListVh(view: View): RecyclerView.ViewHolder(view) {
    fun refreshData(borrower: Borrower) {
        itemView.borrowersListName.text = borrower.name
        itemView.borrowersLisDebt.text = borrower.debt.toString()

        itemView.setOnClickListener {
            Log.e("info", "Clicked")
        }
    }

    public interface BorrowerClickCallbacks {
        fun onItemClick(position: Int)
    }
}

class BorrowersListAdapter(private val dane: List<Borrower>) :  RecyclerView.Adapter<BorrowersListVh>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BorrowersListVh {
        return BorrowersListVh (
            LayoutInflater.from(parent.context).inflate(R.layout.borrowers_list_item, parent,false)
        )
    }

    override fun getItemCount(): Int = dane.size

    override fun onBindViewHolder(holder: BorrowersListVh, position: Int) {
        val borrower: Borrower = dane[position]
        holder.refreshData(borrower)

        // add notify
    }
}

1)这里的答案适用于 Kotlin 和 Java:

如何实现点击监听回调 https://stackoverflow.com/questions/61733698/how-to-access-component-of-mainactivity-in-recycler-view-to-make-onclick-listene/61733999#61733999

2) 仅 Kotlin(Lambda):

在您的适配器中: 添加一个名为listener这是您从 Activity 或 Fragment 传递的 lambda:

class MyAdapter(private val listener: (position: Int) -> Unit) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    ...

    inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {

        init {
            itemView.setOnClickListener(this)
        }

        override fun onClick(v: View?) {
            listener.invoke(adapterPosition)
            //or listener(adapterPosition)
        }
    }

}

在您的活动/片段中onCreate()设置recyclerview的布局管理器后:

recyclerView.adapter = MyAdapter { position ->
    //Do anything you like when some item gets click in your adapter you 
    //can use the position
}

请小心内部类,因为它们可能会导致应用程序内存泄漏,为了提高安全性,您可以切换到使用嵌套类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Recycler View 回调活动 的相关文章