如何实时更新价值回收视图元素



如何实时更新项值?我有一份清单。元素被添加到其中。(通过蓝牙连接的设备列表(。每个单元格都包含信息:名称、日期。例如,在不更新所有列表的情况下,如何更改任何单元格中的名称?现在,当我调用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将负责更新屏幕上的数据。

最新更新