android - 如何使用片段内的实时数据更新 Recycler 视图?
问题描述
我想更新我的回收器视图,这样每当我从数据库中的表中删除一行时,它都会立即更新回收器视图而不刷新片段。
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View?
{
var binding:FragmentDisplayBinding = DataBindingUtil.inflate(inflater,R.layout.fragment_display,container,false)
var view:View = binding.root
var new_task : FloatingActionButton = view.findViewById(R.id.add_newTask)
var db = Room.databaseBuilder(context!!,tasksDb:: class.java,"mydb").allowMainThreadQueries().build()
viewManager = LinearLayoutManager(context)
recyclerView = view.findViewById(R.id.recyclerView)
db.task().getAll().observe(this, Observer {
this.myAdapter = myAdapter(it)
recyclerView.adapter = myAdapter
recyclerView.layoutManager = viewManager
})
我相信我不应该在 onCreateView() 方法中使用 .observe() 。我应该在代码中实现哪些更改?
解决方案
我试图在 Internet 上找到一些示例解决方案。应该有,但是没找到。我发现其中许多太短或太详细。所以我会放在这里正是你需要的。有一个涉及RecyclerView
+的标准化模式LiveData
,所以只需按照这个模式来处理你的所有RecyclerView
+LiveData
用法。
分段:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
...
val recyclerView = view.findViewById(R.id.recyclerView)
val myAdapter = MyAdapter()
recyclerView.adapter = myAdapter
// recyclerView.layoutManager = LinearLayoutManager(context) // You need this only if you haven't set it in xml
db.task().getAll().observe(viewLifecycleOwner, Observer {
myAdapter.submitList(it)
})
}
这里做了一些重要的改变:
- 你必须
.observe()
在onCreateView()
. 不仅针对这种特定情况,而且通常.observe()
如果您使用LiveData
正确,您将永远不需要在任何其他地方打电话。 viewLifecycleOwner
LifecycleOwner
用于观察 a是正确的LiveData
。(除非您创建一个自定义的。)- 取决于用例,但通常每个实例化一个适配器
RecyclerView
,即使您的数据随时间变化。您应该交换数据,而不是整个适配器。
我的适配器:
MyAdapter
应该实现.submitList()
视图将使用的功能
class MyAdapter: RecyclerView.Adapter<ViewHolder>() {
val myData = mutableListOf<Data>()
fun submitList(newData: List<Data>) {
myData.clear()
myData.addAll(newData)
notifyDataSetChanged()
}
}
请注意,notifyDataSetChanged()
这实际上是向适配器发出信号以更新视图。
改进:
我认为上述解决方案足以解决您的问题,因为您的列表不是太大或更新太频繁。如果您想进一步提高性能和/或可读性,请探索以下内容:
推荐阅读
- r - 为什么 R4DS 的传单示例不起作用?
- r - 根据data.frame列在散点图中设置标记颜色
- python - 如何通过 2 个文本查找元素?
- python - 如何使用 Python 插入 3D 曲面图(2D 数组)的缺失值(未定义区域)?
- r - 是否可以将警告存储在变量中以供以后使用?
- python - Python 编程:类
- python - 如何使用每个对象具有的“顺序”属性来简化此代码以重新排序对象列表?
- android - 如何在 Android 上正确发送重复通知
- javascript - 为什么这段代码不运行,而是向我发送此错误:(未处理的拒绝(TypeError):this.state 不是函数)
- r - 如何按 R 数据框中的连续行分组?