如何在 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){
}
}
}
在
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 **/ }
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)
}
不确定我是否理解你的问题,但如果你想在每次更新 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
}
}