我正在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()
删除适配器中的侦听器和数据。
有关详细信息,请查看此内容: 适配器生命周期
注意:
如果使用上述方法后,您得到一个nullpointexception
或cannot resolve symbol
,您必须将adapter
声明为全局变量,请检查以下答案: startListening(( 中的错误
除了Peter的回答中所说的内容之外,根据FirebaseRecyclerAdapater最新的api文档,您还可以在由构建器创建的FirebaseRecyclerOptions
实例中创建FirebaseRecyclerAdapter
传递。在构建器中,您可以指定生命周期所有者,这样就不必手动修改其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)
}
}
}
选项生成器由一个 setQuery 方法组成,该方法接受对 db 和模型对象的引用;setLifecycle Owner,该方法接受将触发适配器更新的活动。