首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LiveData在RecyclerView中的观察者-高岭土

LiveData在RecyclerView中的观察者-高岭土
EN

Stack Overflow用户
提问于 2021-04-09 16:11:28
回答 2查看 2.2K关注 0票数 1

如何在回收器视图中实现LiveData观察者?我有一个全局var‘`someDataChanged’,它是从另一个片段中更新的。任何帮助都将不胜感激!

代码语言:javascript
运行
复制
class GlobalActivity {

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

然后在用于Adapter.kt的RecyclerView中,我需要侦听如果是someDataChanged。我有以下代码:

代码语言:javascript
运行
复制
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){

        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2021-04-09 16:35:08

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

代码语言:javascript
运行
复制
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
    }
    
}

票数 1
EN

Stack Overflow用户

发布于 2022-08-02 02:52:42

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

代码语言:javascript
运行
复制
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作为param。

代码语言:javascript
运行
复制
inner class ItemViewHolder(view: View, private val lifecycleOwner: LifecycleOwner) : RecyclerView.ViewHolder(view) {

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

代码语言:javascript
运行
复制
mutableLiveData.observe(lifecycleOwner) { /** your logic handle **/ }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67024618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档