Androidで、ユーザーが相互に書き込んだメッセージをGoogle Firebaseを使用して保存するチャットアプリを作成しています。これらのメッセージをユーザーに表示するには、データベースからメッセージを読み取り、カスタムに整理します。 ListAdapterを使用したListView。これは、依存関係、特にfirebaseuiを次のように更新するまで正常に機能していました。
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()));
}
};
このコードは正常にコンパイルされますが、リストビューにデータが表示されていません。新しいfirebaseui依存関係を使用してリストアダプターを作成する特定の正しい方法はありますか?
これを使用する必要があります:
_@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
_
FirebaseListAdapter
はリスナーを使用してFirebaseデータベースの変更をチェックするため、データをリッスンするには、adapter.startListening()
内にonStart()
を追加して表示できるようにする必要がありますリストビューのデータ。
次に、onStop()
内(アクティビティが停止している場合)で、adapter.stopListening()
を使用して、アダプター内のリスナーとデータを削除できます。
詳細については、これを確認してください: アダプタライフサイクル
上記を使用した後、nullpointexception
または_cannot resolve symbol
_を取得した場合は、adapter
をグローバル変数として宣言する必要があり、以下の回答を確認してください。 startListening( )
Peterの回答 で述べられていることに加えて、FirebaseRecyclerAdapaterの最新の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)
}
}
}
オプションビルダーは、dbとモデルオブジェクトへの参照を取り込むsetQueryメソッドで構成されています。アダプターの更新をトリガーするアクティビティーを取り込むsetLifecycleOwner。