【发布时间】:2022-02-07 10:11:22
【问题描述】:
我正在尝试使用 LiveData 从本地数据库加载数据列表。
view.xml
... // constraint layout surrounds this
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView_cities"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp" />
这是我在 Fragment 中设置回收站视图的方式:
val citiesAdapter = CitiesAdapter(cityRepository)
with(view.recyclerView_cities) {
layoutManager = LinearLayoutManager(activity)
setHasFixedSize(true)
adapter = citiesAdapter
}
cityRepository.getAllCities().observe(this, Observer { list ->
citiesAdapter.submitList(list)
})
适配器:
class CitiesAdapter(private val repository: CityRepository) : ListAdapter<City, CitiesAdapter.CardViewHolder>(CityCallback()) {
class CityCallback: DiffUtil.ItemCallback<City>() {
override fun areItemsTheSame(oldItem: City, newItem: City): Boolean {
return oldItem.city == newItem.city && oldItem.stateId == newItem.stateId
}
override fun areContentsTheSame(oldItem: City, newItem: City): Boolean {
return oldItem.city == newItem.city &&
oldItem.stateName == newItem.stateName &&
oldItem.stateId == newItem.stateId &&
oldItem.selected == newItem.selected
}
}
fun getCityAt(position: Int): City = getItem(position)
// Provide a reference to the views for each data item
class CardViewHolder(cardView: CardView) : RecyclerView.ViewHolder(cardView) {
lateinit var checkBox: CheckBox
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
...
}
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
...
}
}
cityRepository.getAllCities() 从我的数据库中返回一个 LiveData>。
我正在使用从 RecyclerView 扩展而来的 ListAdapter,以便它可以为我管理列表。此外,我正在使用 DiffUtil,以便调用更精细的通知,而不仅仅是使用 notifyDataSetChanged。
预期行为: 当我加载片段时,RecyclerView 中会显示一个列表,其中包含数据库中的所有城市。
实际行为: 当我加载片段时,即使数据库中有城市,也会显示一个空列表。如果我从片段中添加一个新城市,列表中会填充之前的所有内容以及新添加的项目。
编辑: 我在 xml 中插入了一个 EditText,当我从模拟器中单击它时,列表就会填充。当我尝试以编程方式单击它时它不起作用。
【问题讨论】:
-
您能否说明如何填充
LiveData以及citiesAdapter.submitList是什么?我猜一些填充动作不会通知观察者。 -
livedata 由来自我的 DAO 的 Room 查询填充。 submitList 是
ListAdapter<T, VH>的库函数,所以我无法控制它。 -
你在适配器的构造函数中添加了
super(User.DIFF_CALLBACK);吗?
标签: android kotlin android-recyclerview