RecyclerView 中 LiveData 的观察者 - Kolin

问题描述 投票:0回答:3

如何在 Recycler 视图中实现 LiveData Observer?我有一个全局变量“someDataChanged”,它从另一个片段更新。任何帮助将不胜感激!

class GlobalActivity {

    companion object {
        someDataChanged = MutableLiveData<Int>()
    }
}

然后在 RecyclerView 的 Adapter.kt 中,我需要监听是否

someDataChanged
。我有以下代码:

Adapter.kt
var mRecyclerView: RecyclerView? = null

class MainAdapter(val myResponse: MyResponse): RecyclerView.Adapter<CustomViewHolder>(){

    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
    
        //Error: this is not recognized.  
        GlobalActivity.someDataChanged`.observe(this, Observer{
            println("Data Changed")
        })

        val layoutInflater = LayoutInflater.from(parent?.context)
        val cellForRow = layoutInflater.inflate(R.layout.my_custom_cell, parent,false)
        return CustomViewHolder(cellForRow)

    }

    override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
 
        //some code
        class CustomViewHolder(val view: View, var myPass: Passes? = null): RecyclerView.ViewHolder(view){

        }
    }
}
android kotlin android-recyclerview android-livedata
3个回答
1
投票

RecyclerView.Adapter
中需要重写onCreateViewHolder,传递
lifeCycleOwner

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
    val lifeCycleOwner = parent.context as LifecycleOwner
    val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
    return ItemViewHolder(view, lifeCycleOwner)
}

你的内部类构造函数,应该有

lifecycleOwner
作为参数

inner class ItemViewHolder(view: View, private val lifecycleOwner: LifecycleOwner) : RecyclerView.ViewHolder(view) {

然后就可以正常使用代码了

mutableLiveData.observe(lifecycleOwner) { /** your logic handle **/ }

0
投票

TLDR:RecylerViews 通知同一列表实例上的更改,但 LiveData 仅在重新分配其值时通知其观察者的更改。

为什么不尝试使用 ListAdapter 而不是简单的 RecyclerView.Adapter?

以下是如何实现它的示例: 首先创建您的适配器类;继承ListAdapter:

class EmployeeRecyclerViewAdapter(
private val onClickListener: (Employee) -> Unit) : ListAdapter<Employee, EmployeeViewHolder>(EmployeeDiffCallback()) {

实现 ListAdapter 与 RecyclerView.Adapter 几乎相同,但有一些差异,例如创建 DiffCallback,我不会详细介绍。

然后,观察列表值(如下面的代码片段)并通知适配器上的更新:

viewModel.employeeListLiveData.observe(this) { employeeList ->

        cardViewListLoading.visibility = when {
            employeeList.isEmpty() -> View.VISIBLE
            else -> View.GONE
        }

        (recyclerView.adapter as EmployeeRecyclerViewAdapter).submitList(employeeList)
}

-1
投票

不确定我是否理解你的问题,但如果你想在每次更新 liveData 时更新你的回收器视图,你应该创建如下内容:

class MyActivity : AppCompatActivity() {

    private val viewModel: MyViewModel by viewModels()
    lateinit var adapter: MyAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        adapter = MyAdapter()
        recyclerView.adapter = adapter
        viewModel.myLiveData.observe(this, Observer { newContent ->
            adapter.updateContent(newContent)
        })
    }
}

class MyViewModel: ViewModel() {
    private val _myLiveData = MutableLiveData<String>()
    val myLiveData: LiveData<String> = _myLiveData
   
    // You should call this to update you liveData
    fun updateInfo(newInfo: String) {
        _myLiveData.value = newInfo
    }
}

class MyAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    private var content: String = ""
    ...
    
    fun updateInfo(newString: String) {
        content = newString
        notifyDataSetChanged() //or you can implement a DiffUtil.Callback
    }
    
}

© www.soinside.com 2019 - 2024. All rights reserved.