FirebaseListAdapter在聊天应用中无法推送单个项目 - Firebase-Ui 3.1

13

我正在为Android开发一个聊天应用程序,它使用谷歌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 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()));
        }
    };

现在这段代码可以编译通过,但是listview没有显示数据。有没有特定的正确方式来使用新的Firebase Ui依赖项来创建列表适配器?

2个回答

18

让 FirebaseRecyclerAdapter 和 FirebaseListAdapter 在 activity 中展示数据

你需要使用以下代码:

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


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

由于 FirebaseListAdapter 使用监听器检查 firebase 数据库中的更改,因此要开始监听数据,您需要在 onStart() 中添加 adapter.startListening() 以能够在列表视图中显示数据。

然后在 onStop() 中(当活动停止时),您可以使用 adapter.stopListening() 来移除监听器和适配器中的数据。

详细信息请参见:Adapter LifeCycle

注意:

如果使用上述方法后出现 nullpointexceptioncannot resolve symbol,则必须将 adapter 声明为全局变量,并请查看以下答案:Error in startListening()


2
除了Peter的回答中提到的内容外,根据FirebaseRecyclerAdapater最新的API 文档,你可以创建一个FirebaseRecyclerAdapter并传入一个FirebaseRecyclerOptions实例,该实例是由一个构建器创建的。在构建器中,你需要指定一个生命周期所有者,这样你就不必手动修改它的onStartonStop方法了。
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 方法组成。setQuery 方法接受对数据库的引用和模型对象作为参数;setLifecycleOwner 方法接受将触发适配器更新的活动作为参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接