如何将按钮单击事件传递给 Android 中的 PagedList 中的 Activity?
how to pass button click event to Activity in PagedList in Android?
我正在尝试将 PagedList
应用到我的应用中。我想要的功能之一是能够处理列表项中的按钮单击事件。
我想利用 ViewModel
来监听点击事件,并从示例 https://medium.com/@star_zero/singleliveevent-livedata-with-multi-observers-384e17c60a16 中获取,我成功地获得了点击事件。
所以我有,
LivePagedListBuilder(DeviceDataSourceFactory(), defaultConfig)
.build()
.observe(this, Observer { list ->
// here is where I have Observer for the click event
// for example, list?.forEach { it.event.observe(...) }
// but this block isn't called everytime
adapter.submitList(list)
})
正如上面的评论,当新项目添加到列表时,我并不总是收到通知。我想我只从 loadInitial
得到一次,一次从 loadAfter
得到。链接 ref 后,PagedList
处理更新列表本身而不通知观察者。因此,我无法正确设置点击事件观察者。任何帮助,将不胜感激。被封锁了一个多星期。谢谢!
您始终可以将对 OnClickListener
的引用传递给 Adapter
class。
例如:
//Reference of click listener in your Adapter class
//Initialise clickListener in adapter's init method, You can pass ViewModel's reference to the adapter as the reference of YOUR_LISTENER_IMPL
val clickListener : YOUR_LISTENER_IMPL
//ViewHolder class
class YOUR_VIEW_HOLDER(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(data: YOUR_DATA_TYPE, clickListener: (YOUR_DATA_TYPE) -> Unit) {
itemView.setOnClickListener { clickListener(data)}
}
}
//onBindViewHolder method inside Adapter
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
// Populate ViewHolder with data that corresponds to the position in the list
// which we are told to load
(holder as YOUR_VIEW_HOLDER).bind(DATA_SOURCE_LIST[position], clickListener)
}
然后在初始化适配器时,您可以通过构造函数发送 clickListener
对象。这样,当项目被添加到列表中时,您所有的 ViewHolder
实例将始终有一个 clickListener
并且您不会错过任何点击事件。
希望对您有所帮助。
我正在尝试将 PagedList
应用到我的应用中。我想要的功能之一是能够处理列表项中的按钮单击事件。
我想利用 ViewModel
来监听点击事件,并从示例 https://medium.com/@star_zero/singleliveevent-livedata-with-multi-observers-384e17c60a16 中获取,我成功地获得了点击事件。
所以我有,
LivePagedListBuilder(DeviceDataSourceFactory(), defaultConfig)
.build()
.observe(this, Observer { list ->
// here is where I have Observer for the click event
// for example, list?.forEach { it.event.observe(...) }
// but this block isn't called everytime
adapter.submitList(list)
})
正如上面的评论,当新项目添加到列表时,我并不总是收到通知。我想我只从 loadInitial
得到一次,一次从 loadAfter
得到。链接 ref 后,PagedList
处理更新列表本身而不通知观察者。因此,我无法正确设置点击事件观察者。任何帮助,将不胜感激。被封锁了一个多星期。谢谢!
您始终可以将对 OnClickListener
的引用传递给 Adapter
class。
例如:
//Reference of click listener in your Adapter class
//Initialise clickListener in adapter's init method, You can pass ViewModel's reference to the adapter as the reference of YOUR_LISTENER_IMPL
val clickListener : YOUR_LISTENER_IMPL
//ViewHolder class
class YOUR_VIEW_HOLDER(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(data: YOUR_DATA_TYPE, clickListener: (YOUR_DATA_TYPE) -> Unit) {
itemView.setOnClickListener { clickListener(data)}
}
}
//onBindViewHolder method inside Adapter
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
// Populate ViewHolder with data that corresponds to the position in the list
// which we are told to load
(holder as YOUR_VIEW_HOLDER).bind(DATA_SOURCE_LIST[position], clickListener)
}
然后在初始化适配器时,您可以通过构造函数发送 clickListener
对象。这样,当项目被添加到列表中时,您所有的 ViewHolder
实例将始终有一个 clickListener
并且您不会错过任何点击事件。
希望对您有所帮助。