【问题标题】:how to pass button click event to Activity in PagedList in Android?如何在Android的PagedList中将按钮单击事件传递给Activity?
【发布时间】:2018-08-13 06:07:12
【问题描述】:

我正在尝试在我的应用中采用 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)  
    })

正如上面的评论,当新项目添加到列表中时,我并不总是收到通知。我想我只从loadInitialloadAfter 得到过一次。链接 ref 后,PagedList 处理更新列表本身而不通知观察者。因此,我无法正确设置点击事件观察者。任何帮助,将不胜感激。被封了一个多星期。谢谢!

【问题讨论】:

    标签: android android-pageradapter pagedlist android-paging


    【解决方案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 实例将始终具有clickListener,并且当项目添加到列表中时,您不会错过任何点击事件。
    我希望这会有所帮助。

    【讨论】:

    • 感谢您的建议!如果我找不到任何解决方案,我知道ViewHolder 是我最后的赌注。我仍然更喜欢在ViewModel 中发生点击事件。对我来说更容易使用
    • 你仍然可以在你的ViewModel 中拥有你的OnClickListener,你需要做的就是在你的ViewModel 类中实现OnClickListener 并将ViewModel 类的实例发送到你的adapter 实例。
    • 等等......不,关键是我不能总是得到ViewModel,正如问题中最初所说的那样。否则我可以在Activity 中使用它。如何确保适配器具有所有 ViewModel
    • 请分享您当前用于OnClickListener 的代码,我将为您提供准确的解决方案。
    • 另外,我假设您会初始化适配器一次,然后稍后(分页时)将值添加到它的数据源。这样,您的 OnClickListener 将始终在适配器内部可用(您在初始化时设置),并从那里将其传递给 ViewHolder 对象。
    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2012-02-19
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    相关资源
    最近更新 更多