Построитель опций состоит из метода setQuery, который принимает ссылку на базу данных и объект модели; setLifecycleOwner, который выполняет действие, которое запускает обновления адаптера.

аю приложение для чата на Android, которое использует Google Firebase для хранения сообщений, которые пользователи пишут друг другу. Чтобы отобразить эти сообщения пользователям, я прочитал их из базы данных и организовал их в пользовательский ListView с помощью ListAdapter. Это работало нормально, пока я не обновил свои зависимости, в частности Firebase UI, до:

com.firebaseui:firebase-ui:3.1.0

Теперь код для построения адаптера списка не работает:

adapter = new FirebaseListAdapter<ChatMessage>(FirebaseDatabase.getInstance().getReference("Lobbies").child(leaderID).child("Messages"), ChatMessage.class, R.layout.message, this) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            // Get references to the views of message.xml
            TextView messageText = (TextView)v.findViewById(R.id.message_text);
            TextView messageUser = (TextView)v.findViewById(R.id.message_user);
            TextView messageTime = (TextView)v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getMessageTime()));
        }
    };

Чтобы исправить эту проблему, я обновил код, чтобы он соответствовал новым требованиям пользовательского интерфейса Firebase, сделав код:

FirebaseListOptions<ChatMessage> options = new FirebaseListOptions.Builder<ChatMessage>()
            .setQuery(FirebaseDatabase.getInstance().getReference("Lobbies").child(leaderID).child("Messages"), ChatMessage.class).setLayout(R.layout.message).build();

    adapter = new FirebaseListAdapter<ChatMessage>(options) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            // Get references to the views of message.xml
            TextView messageText = v.findViewById(R.id.message_text);
            TextView messageUser = v.findViewById(R.id.message_user);
            TextView messageTime = v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getMessageTime()));
        }
    };

Этот код теперь хорошо компилируется, но просмотр списка не отображает данные. Есть ли конкретный правильный способ использования новой зависимости пользовательского интерфейса firebase для создания адаптера списка?

Ответы на вопрос(2)

что было сказано вОтвет Питерав соответствии с последним API FirebaseRecyclerAdapaterдокументацияВы можете создатьFirebaseRecyclerAdapter проходя вFirebaseRecyclerOptions Экземпляр, который создается строителем. В конструкторе вы указываете владельца жизненного цикла, поэтому вам не нужно изменять егоonStart или егоonStop вручную:

private fun MainActivity.setUpFirebaseRecyclerAdapter():
    FirebaseRecyclerAdapter<User, ListOnlineViewHolder> {

val options = FirebaseRecyclerOptions.Builder<User>()
        .setQuery(ONLINE_USERS.limitToLast(10), User::class.java)
        .setLifecycleOwner(this)
        .build()

return object : FirebaseRecyclerAdapter<User, ListOnlineViewHolder>(options){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListOnlineViewHolder {
        return ListOnlineViewHolder(
                LayoutInflater.from(parent.context)
                        .inflate(R.layout.user_layout, parent, false))
    }
    override fun onBindViewHolder(holder: ListOnlineViewHolder, position: Int, model: User) {
        holder.bindMessage(model)
    }
}
}

Построитель опций состоит из метода setQuery, который принимает ссылку на базу данных и объект модели; setLifecycleOwner, который выполняет действие, которое запускает обновления адаптера.

Решение Вопроса
Чтобы FirebaseRecyclerAdapter и FirebaseListAdapter отображали данные об активности

Вам нужно использовать это:

@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}


@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}

посколькуFirebaseListAdapter использует прослушиватель для проверки изменений в базе данных firebase, а затем прослушивает данные, которые нужно добавитьadapter.startListening() внутриonStart() чтобы иметь возможность показывать данные в виде списка.

Тогда внутриonStop() (когда деятельность остановлена), вы можете использоватьadapter.stopListening() удалить слушателя и данные в адаптере.

Проверьте это для получения дополнительной информации:Адаптер LifeCycle

Примечание:

Если после использования выше, вы получитеnullpointexception или жеcannot resolve symbol, ты должен объявитьadapter как глобальная переменная и, пожалуйста, проверьте ответ ниже:Ошибка в startListening ()

Ваш ответ на вопрос