【问题标题】:Observer on LiveData in RecyclerView - KolinRecyclerView 中 LiveData 的观察者 - Kolin
【发布时间】:2021-04-09 16:11:28
【问题描述】:

如何在 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){

        }
    }
}

【问题讨论】:

  • 你不应该在你的适配器中观察。而是从您的活动或片段中观察并将信息传递给适配器。
  • 另外我不知道你的具体情况,但有一个LiveData 的单件似乎有点可怕......其次,即使你在适配器内部观察,onCreateViewHolder 也不会做的地方。每次更改都会触发多次。
  • 嗨,我如何将信息传递回适配器?我刚刚发布了这个问题:stackoverflow.com/questions/67024250/…。我无法让 recyclerView.adapter?.notifyDataSetChanged() 在 RecyclerView 上工作。我认为 LiveData 可能是一种解决方法。谢谢!
  • 啊,我明白了。当没有其他可能的解决方案时,应该使用解决方法。我不建议在解决您的第一个问题之前实施解决方法。我会看看你的另一个问题。

标签: android kotlin android-recyclerview android-livedata


【解决方案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
    }
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多