我正在尝试为单个回收器视图项目实现单击侦听器,并使用单击的数据(单个借用者)从我的活动中运行方法。
怎么处理呢?我是 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(使用前将#替换为@)