web-dev-qa-db-ja.com

FirebaseListAdapterがチャットアプリの個々のアイテムをプッシュしない-Firebase-Ui3.1

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依存関係を使用してリストアダプターを作成する特定の正しい方法はありますか?

10
Dylan Kane

FirebaseRecyclerAdapterとFirebaseListAdapterにアクティビティのデータを表示させるには

これを使用する必要があります:

_@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( )

17
Peter Haddad

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。

0
glisu