0

我正在尝试采用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在不通知观察者的情况下处理更新列表本身。因此,我无法正确设置点击事件观察者。任何帮助,将不胜感激。被封了一个多星期。谢谢!

4

1 回答 1

1

您始终可以将您的参考传递OnClickListener给您的Adapter班级。

例如:

//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实例都将始终具有 aclickListener并且您不会错过任何点击事件。
我希望这有帮助。

于 2018-08-15T08:31:39.673 回答