RecyclerView не показывает данные при первой загрузке - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь загрузить список данных из локальной базы данных, используя 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, и список заполняется, когда я нажимаю на него из эмулятора. Он не работает, когда я пытаюсь щелкнуть по нему программно.

Ответы [ 2 ]

0 голосов
/ 31 июля 2019

Вам необходимо прикрепить наблюдателя в жизненном цикле

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProviders.of(this, getViewModelFactory()).get(getModelClass())
        attachObservers()
    }
0 голосов
/ 10 января 2019

Я удалил setHasFixedSize(true) и данные загружены как положено. Кто-нибудь может объяснить, почему это решило это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...