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

Java FirebaseListAdapter未推送聊天应用程序的单个项目-Firebase Ui 3.1,java,android,firebase,firebase-realtime-database,firebaseui,Java,Android,Firebase,Firebase Realtime Database,Firebaseui,我正在Android上制作一个聊天应用程序,它使用google firebase来存储用户之间相互发送的消息。为了向用户显示这些消息,我从数据库中读取它们,并使用ListAdapter将它们组织到自定义ListView中。在我将依赖项(特别是firebase ui)更新为以下内容之前,这一切都很正常: com.firebaseui:firebase-ui:3.1.0 现在,构造列表适配器的代码不起作用,如下所示: adapter = new FirebaseListAdapter<Cha

我正在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()));
        }
    };
adapter=newfirebaselistadapter(FirebaseDatabase.getInstance().getReference(“Lobbies”).child(leaderID).child(“Messages”)、ChatMessage.class、R.layout.message、this){
@凌驾
受保护的void populateView(视图v、聊天信息模型、int位置){
//获取对message.xml视图的引用
TextView messageText=(TextView)v.findviewbyd(R.id.message\u text);
TextView messageUser=(TextView)v.findviewbyd(R.id.message\u user);
TextView messageTime=(TextView)v.findViewById(R.id.message\u time);
//设置他们的文本
messageText.setText(model.getMessageText());
messageUser.setText(model.getMessageUser());
//在显示日期之前格式化日期
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()));
        }
    };
FirebaseListOptions=newfirebaselistoptions.Builder()
.setQuery(FirebaseDatabase.getInstance().getReference(“Lobbies”).child(leaderID).child(“消息”),ChatMessage.class).setLayout(R.layout.message).build();
适配器=新FirebaseListAdapter(选项){
@凌驾
受保护的void populateView(视图v、聊天信息模型、int位置){
//获取对message.xml视图的引用
TextView messageText=v.findviewbyd(R.id.message\u text);
TextView messageUser=v.findviewbyd(R.id.message\u user);
TextView messageTime=v.findviewbyd(R.id.message\u time);
//设置他们的文本
messageText.setText(model.getMessageText());
messageUser.setText(model.getMessageUser());
//在显示日期之前格式化日期
messageTime.setText(DateFormat.format(“dd-MM-yyyy(HH:MM:ss)”,
model.getMessageTime());
}
};
这段代码现在编译得很好,但是listview没有显示数据。是否有一种特定的正确方法可以使用新的firebase ui依赖项生成列表适配器?

让FirebaseRecyclerAdapter和FirebaseListAdapter显示活动上的数据 您需要使用以下选项:

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


@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
由于
FirebaseListAdapter
使用侦听器检查firebase数据库中的更改,因此要侦听数据,您需要在
onStart()
中添加
adapter.startListening()
,以便能够在listview中显示数据

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

查看此项了解更多信息:

注:
如果在使用上述选项后,您得到一个
nullpointexception
无法解析符号
,则必须将
适配器
声明为全局变量,并请检查以下答案:

根据FirebaseRecyclerAdapter最新api,除了中所述内容之外,您可以创建一个
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)
    }
}
}
private fun MainActivity.setUpFirebaseRecyclerAdapter():
火基回收适配器{
val options=FirebaseRecyclerOptions.Builder()
.setQuery(ONLINE_USERS.limitToLast(10),User::class.java)
.setLifecycleOwner(此)
.build()
返回对象:FirebaseRecyclerAdapter(选项){
重写CreateViewHolder(父级:ViewGroup,viewType:Int):ListOnlineViewHolder{
返回ListOnlineViewHolder(
LayoutInflater.from(parent.context)
.充气(R.layout.user\u布局,父级,假))
}
覆盖BindViewHolder(holder:ListOnlineViewHolder,位置:Int,型号:User){
holder.bindMessage(型号)
}
}
}
options builder由一个setQuery方法组成,该方法接收对db的引用和一个模型对象;接收将触发适配器更新的活动的setLifecycleOwner