FirebaseListAdapter不会为聊天应用推送单个项目 - Firebase-Ui 3.1

Dyl*_*ane 10 java android firebase firebase-realtime-database firebaseui

我在Android上制作了一个聊天应用程序,它使用google firebase来存储用户互相写入的消息.要向用户显示这些消息,我从数据库中读取这些消息,并将它们组织到带有ListAdapter的自定义ListView中.这工作正常,直到我更新我的依赖项,特别是firebase ui到:

com.firebaseui:firebase-ui:3.1.0
Run Code Online (Sandbox Code Playgroud)

现在构建列表适配器的代码不起作用,是:

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()));
        }
    };
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我更新了代码以符合新的firebase ui要求,使代码变为:

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()));
        }
    };
Run Code Online (Sandbox Code Playgroud)

此代码现在编译正常,但listview不显示数据.是否有一种特定的正确方法来使用新的firebase ui依赖项来制作列表适配器?

Pet*_*dad 17

让FirebaseRecyclerAdapter和FirebaseListAdapter显示活动数据

你需要使用这个:

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


@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
Run Code Online (Sandbox Code Playgroud)

由于FirebaseListAdapter使用了监听器来检查在火力数据库的更改,然后被监听,你需要添加数据adapter.startListening()里面onStart()能够显示在列表视图中的数据.

然后在内部onStop()(当活动停止时),您可以使用adapter.stopListening()删除适配器中的侦听器和数据.

查看此信息以获取更多信息:Adapter LifeCycle

注意:

如果在使用上面的内容后,你得到一个nullpointexception或者cannot resolve symbol,你必须声明adapter为全局变量,请检查以下答案:startListening()中的错误