Я пытаюсь загрузить список данных из локальной базы данных, используя 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" />
вот как я настраиваю представление переработчика во фрагменте:
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> из моей базы данных.
Я использую ListAdapter, который выходит из RecyclerView, чтобы он мог обрабатывать управление списком для меня. Также я использую DiffUtil, чтобы вызывать более детальные уведомления, а не просто использовать notifyDataSetChanged.
Ожидаемое поведение:
Когда я загружаю фрагмент, в RecyclerView отображается список со всеми городами в базе данных.
Фактическое поведение:
Когда я загружаю фрагмент, отображается пустой список, хотя в базе данных есть города. если я добавляю новый город из фрагмента, список заполняется всем, что было там ранее, и вновь добавленным элементом.
EDIT:
Я взломал EditText для XML, и список заполняется, когда я нажимаю на него из эмулятора. Он не работает, когда я пытаюсь щелкнуть по нему программно.