如何实时更新项值?我有一份清单。元素被添加到其中。(通过蓝牙连接的设备列表(。每个单元格都包含信息:名称、日期。例如,在不更新所有列表的情况下,如何更改任何单元格中的名称?现在,当我调用update
方法时,第一个列表元素(在位置0(中的信息会发生变化,但我需要在调用update
方法时,我可以更改任何位置和任何元素的值。我读了关于DiffUtil
班的文章。但我不确定这是否适合我。所以,我有模型类:
data class Device (
var name: String,
var date: String
)
适配器:
class CustomRecyclerAdapter(private val values: MutableList<Device>) :
RecyclerView.Adapter<CustomRecyclerAdapter.MyViewHolder>() {
override fun getItemCount(): Int {
return values.size
}
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(viewGroup.context)
.inflate(R.layout.list_item, viewGroup, false)
return MyViewHolder(view)
}
override fun onBindViewHolder(viewHolder: MyViewHolder, position: Int) {
var device: Device = values[position]
viewHolder.bin(device)
}
class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {
var textName: TextView? = null
var textDate: TextView? = null
init {
textName = view.findViewById(R.id.name)
textDate = view.findViewById(R.id.date)
}
fun bin(device:Device) {
textName?.text = device.name
textDate?.text = device.date
}
}
class MyFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_upload_card, container, false)
var recyclerView = view.findViewById(R.id.recyclerView) as RecyclerView
recyclerView.layoutManager = LinearLayoutManager(activity)
adapter = CustomRecyclerAdapter(list)
recyclerView.adapter = adapter
return view
}
private fun addItem() {
var device = Device("DeviceName", "date")
list.add(0, device)
adapter?.notifyItemInserted(0)
}
fun update() {
list[0].run {
name = "newName"
date = "newDate"
}
adapter?.notifyDataSetChanged()
}
也许我必须在这里使用RX?但我不明白在这种情况下是怎么做到的
针对您的场景的建议解决方案。
我将在这里讨论几点。
- RecyclerView有许多方法,例如添加、删除、更新、范围更新等
您想要更新项目的情况:
-
单个项目/行:如果您想更新单个行,您应该该行的位置。这是你的任务,你如何获得
职位。例如,一旦获得了更新的行数据,就可以
从列表中搜索并从中获取位置。可以使用以下方法notifyItemChanged,notifyItemsRangeChanged -
所有列表:如果你已经得到了整个列表,你可以使用DiffUtil来更新这个列表。
对于实时数据,您可以使用Livedata、RxJava,但上述过程将保持不变。使用LiveData,您可以观察数据库中的变化。
如果你有解决方案,请告诉我。
如果我正确理解了这个问题,你需要调用notifyItemChanged
,而不是adapter?.notifyDataSetChanged()
,这个方法有两个不同的调用,一个带有位置,另一个带有用于目标项目的部分更改的位置和有效载荷,请在这里检查
请将数据源封装在Live Data
中。然后将这些实时数据传递到Recycler View Adapter。
例如@Query("SELECT * FROM word_table ORDER BY word ASC")
fun getAlphabetizedWords(): LiveData<List<Word>>
然后,当数据库发生更改时,Recycler View将负责更新屏幕上的数据。