回收者视图回调到活动 [英] Recycler View Callback to activity

查看:86
本文介绍了回收者视图回调到活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆