当前位置: 首页 > 知识库问答 >
问题:

FirebaseListAdapter未推送聊天应用程序的单个项目-Firebase Ui 3.1

颜新
2023-03-14

我正在Android上制作一个聊天应用程序,它使用谷歌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 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个答案

吴子昂
2023-03-14

除了在彼得的回答中所说的,根据最新的api留档,您可以创建一个传递由生成器创建的一个实例的。在构建器中,您指定了一个生命周期所有者,因此您不必手动修改其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)
    }
}
}

options builder由一个setQuery方法组成,该方法接收对db的引用和一个模型对象;接收将触发适配器更新的活动的setLifecycleOwner。

吕向阳
2023-03-14

您需要使用以下选项:

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


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

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

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

检查此项了解更多信息:适配器生命周期

如果在使用上述方法后,您得到nullpointexception无法解析符号,则必须将适配器声明为全局变量,并请检查以下答案:startListening()中的错误

 类似资料:
  • 我没有收到接收消息的推送通知等,也不确定有什么其他杠杆可供我使用。如果团队中的任何人看到这条消息,我很想知道如何调试它。

  • 问题内容: 我想知道为数千名用户编写聊天应用程序的正确方法是什么。 我只是感到困惑,我如何才能每秒使用AJAX或更少的方法来对服务器执行ping操作,并检查MySQL中是否有新记录等,并且服务器负载可以接受。 我目前正在考虑使用jQuery,PHP和MySQL进行编码。 请指教。您的帮助将不胜感激。 问题答案: 客户端 对于需要轮询服务器的任何程序,我建议使用WebSockets。 我写了一个非常

  • 我正在使用XMPP在app引擎上编写一个聊天应用程序。我的想法是允许用户互相聊天。我可以将消息发送到google talk帐户,方法是将登录的用户删除地址的@gmail.com部分,并将其替换为@appid.appspotchat.com)。例如,如果登录的用户是bob@gmail.com,则用于发送的jid将是bob@appid.appspotchat.com)。然后,您可以将消息发送到goog

  • 现在我们已经熟悉了Socket.IO,让我们编写一个聊天应用程序,我们可以用它在不同的聊天室聊天。 我们将允许用户选择用户名并允许他们使用它们进行聊天。 首先,让我们设置我们的HTML文件来请求用户名 - <!DOCTYPE html> <html> <head> <title>Hello world</title> </head> <script src = "/s

  • 我正在使用聊天应用程序,我需要每一秒钟刷新一次列表。我使用处理程序重复调用该方法,但是它没有更新< code>ListView。我正在调用该方法中更改的通知数据集。 Messages.java 聊天适配器.java 更新的Message.java ChatDetail.xml ChatLeft.xml chattright . XML

  • 问题内容: 在我目前正在从事的项目中,我们需要开发一个Web聊天应用程序,而不是一个非常复杂的聊天,仅是一种将两个人联系起来谈论一个非常具体的话题的方式,我们不需要任何身份验证对于这两个用户之一,我们不必支持表情符号,头像或类似的东西。 一些项目成员建议我们可以通过BOSH使用XMPP,我说这就像试图用船网抓鱼,并提出了一种更简单的方法,例如简单的Ajax / MySQL网络聊天,但是我们担心性能