回收者视图回调到活动 [英] Recycler View Callback to activity
问题描述
我正在尝试为单个回收者视图项目实现点击侦听器,并在我的活动中使用点击的数据(单个借阅者)运行方法.
I'm trying to implement a click listener for a single recycler view item and run method from my activity with clicked data (single borrower).
如何处理?我是Kotlin的新手,所以分步说明将非常有帮助:)
How to deal with it? I'm new in kotlin, so step-by-step instruction will be very helpful :)
谢谢!
MainActivity:
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)
}
}
}
}
适配器:
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上均适用:
2)仅Kotlin(Lambdas):
在适配器中:添加一个名为 listener
的属性,该属性是您通过活动或片段传递的lambda:
In your Adapter:
Add a property named listener
that is a lambda you pass from your activity or fragment:
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)
}
}
}
在设置recyclerview的布局管理器后,在您的活动/片段 onCreate()
中:
In your Activity/Fragment onCreate()
after setting recyclerview's layout manager:
recyclerView.adapter = MyAdapter { position ->
//Do anything you like when some item gets click in your adapter you
//can use the position
}
请谨慎使用内部类,因为它们可能会导致应用程序中的内存泄漏,为了提高安全性,您可以切换到使用嵌套类.
Be careful with inner classes as they can lead to a Memory Leak in your app, for more safety you can switch to using Nested classes.
这篇关于回收者视图回调到活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!