RecyclerViewAdapter - список обновляется, но представление не - PullRequest
1 голос
/ 03 мая 2019

Я создал приложение для Android TV, которое отображает список элементов из Firebase.

Ожидаемое поведение:
После внесения каких-либо изменений в базу данных получить базу данных и обновить представление.

Что не так?
Данные извлекаются и отображаются правильно, до того момента, как я заблокирую устройство.После этого он немедленно прекращает обновлять вид only .Я поместил некоторые «Log.d» в свой класс адаптера, чтобы напечатать обновленный список, и список обновляется, как и должно быть.Итак, в заключение, данные выбираются правильно, список обновляется, а представление - нет (оно остается как список до того, как была активна блокировка устройства).

Код:
Обратный вызов из бэкэнда с измененным списком:

 override fun onDataSetChanged(prepareList: List<Long>) {
    mPrepareAdapter.setOnDataSetChanged(prepareList)
}

Адаптер:

var prepareList: MutableList<Long> = ArrayList()
...
fun setOnDataSetChanged(list: List<Long>){
    prepareList.clear()
    prepareList.addAll(list)
    this.notifyDataSetChanged()
    Log.d("prepareListAdapter", prepareList.toString())
}

Примечание: Я не публиковал методы жизненного цикла, такие как onResume() и т. Д., Так как они работают правильно.Сказав это, они только должны удалить наблюдателей данных или добавить их для наблюдения за изменениями в базе данных.Как упомянуто выше, данные извлекаются правильно в течение всего времени, даже после того, как устройство заблокировано и разблокировано, но только представление не обновляется.
Плюс, я установил менеджер раскладки в onCreate(), до того, как адаптер был установлен.

Редактировать: После прочтения этого поста пару раз и сосредоточения внимания на жирном слове «только» рядом с «видом», я привел меня к отладке этого приложения на мобильном устройстве и созданию второго адаптераиспользуя FirebaseUI.Вот некоторые заметки из моих тестов:

  • Android TV имеет какой-то странный жизненный цикл активности, так как он корректно работает на мобильных устройствах
  • Это не ошибка, связанная с данными / методами.Это связано с представлением или контекстом.
  • Как уже упоминалось в предыдущем пункте, это не проблема доставки данных, поэтому вызов NotifyDataSetChanged() в onResume() не решает проблему, потому что это (?)проблема, связанная с просмотром.

Поведение с FirebaseRecyclerAdapter на Android TV:
Приложение работает нормально, пока устройство не заблокировано.После того, как устройство заблокировано и разблокировано, RecyclerView очищается, хотя журналы показывают, что данные по-прежнему выбираются правильно и должны отображаться.

Итак, мне кажется, что после блокировки устройства адаптер теряет ссылку на просмотр, вот мой код onCreateViewHolder(), аналогичный классу Kotlin:

private LayoutInflater inflater;

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    if (inflater == null) {
        Context context = viewGroup.getContext();
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    View view = inflater.inflate(R.layout.item_textview_prepare, viewGroup, false);
    return new ViewHolder(view);
}

Создание нового экземпляра адаптерав onResume() (да, мы не должны этого делать, я знаю), передавая контекст адаптеру?Ничего не помогает, RecyclerView по-прежнему остается пустым .

Таким образом, единственное различие между расширениями RecyclerView.Adapter и FirebaseRecyclerAdapter заключается в том, что в предыдущем отображается старый список, когда в последнем View ссылка теряется (? Не?),

Для конца: вот самое смешное.Это работает правильно не на всех мобильных устройствах, даже на одной версии Android.Ошибка возникает как на реальном Android TV, так и на эмуляторе Android TV (один с Google API).

Я знаю, что это довольно длинный пост и много читать, я прошу прощения за это, но есть ли у вас какие-либо идеи, что я могу сделать больше, чтобы исправить это?Я пытался это исправить уже третий день, и больше ничего не приходит мне в голову.

1 Ответ

0 голосов
/ 03 мая 2019

В вашем методе onResume() выполните notifyDataSetChanged(), так как вы блокируете устройство, когда вы возвращаетесь к нему, должно сработать onResume(), а затем вы можете обновить вид.

enter image description here

...