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



我正在Android上制作一个聊天应用程序,该应用程序使用Google Firebase来存储用户相互写入的消息。为了向用户显示这些消息,我从数据库中读取它们,并将它们组织到带有ListAdapter的自定义ListView中。在我将依赖项(特别是 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 界面依赖项来制作列表适配器?

让 FirebaseRecyclerAdapter 和 FirebaseListAdapter 显示有关活动的数据

你需要使用它:

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

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

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

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

有关详细信息,请查看此内容: 适配器生命周期

注意:

如果使用上述方法后,您得到一个nullpointexceptioncannot resolve symbol,您必须将adapter声明为全局变量,请检查以下答案: startListening(( 中的错误

除了Peter的回答中所说的内容之外,根据FirebaseRecyclerAdapater最新的api文档,您还可以在由构建器创建的FirebaseRecyclerOptions实例中创建FirebaseRecyclerAdapter传递。在构建器中,您可以指定生命周期所有者,这样就不必手动修改其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 方法组成,该方法接受对 db 和模型对象的引用;setLifecycle Owner,该方法接受将触发适配器更新的活动。

相关内容

  • 没有找到相关文章

最新更新