Java FirebaseListAdapter未推送聊天应用程序的单个项目-Firebase Ui 3.1
我正在Android上制作一个聊天应用程序,它使用google firebase来存储用户之间相互发送的消息。为了向用户显示这些消息,我从数据库中读取它们,并使用ListAdapter将它们组织到自定义ListView中。在我将依赖项(特别是firebase ui)更新为以下内容之前,这一切都很正常: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
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