【问题标题】:Android- Firebase data not showing in ArrayListAndroid-Firebase 数据未显示在 ArrayList 中
【发布时间】:2019-01-03 00:26:20
【问题描述】:

我正在尝试从 Firebase 数据库中检索数据。顶层节点是消息,子节点是作者和消息。登录后,从数据库中提取聊天消息。 ChatActivity 调用ChatListAdapter 使用以下代码:-

    mAdapter = new ChatListAdapter(this, mDatabaseReference);
    mChatListView.setAdapter(mAdapter);

这里的mChatListViewRecyclerView。适配器代码如下:-

    public class ChatListAdapter extends RecyclerView.Adapter<ChatListAdapter.ViewHolder> {
    private Activity mActivity;
    private DatabaseReference mDatabaseReference;
    private ArrayList<DataSnapshot> mSnapshotList;

    private ChildEventListener mListener = new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            mSnapshotList.add(dataSnapshot);
            notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView authorName, body;

        public ViewHolder(View view) {
            super(view);
            authorName = (TextView) itemView.findViewById(R.id.author);
            body = (TextView) itemView.findViewById(R.id.message);

        }
    }

    public ChatListAdapter(Activity activity, DatabaseReference ref) {
        this.mActivity = activity;
        this.mDatabaseReference = ref.child("messages");
        mDatabaseReference.addChildEventListener(mListener);
        mSnapshotList = new ArrayList<>();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.chat_row, parent, false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        InstantMessage message = getItem(position);
        String author = message.getAuthor();
        holder.authorName.setText(author);
        String msg = message.getMessage();
        holder.body.setText(msg);
    }

    public InstantMessage getItem(int i) {
        DataSnapshot snapshot = mSnapshotList.get(i);
        return snapshot.getValue(InstantMessage.class);
    }

    @Override
    public int getItemCount() {
        return mSnapshotList.size();
    }    
}

ChatActivity如下:-

    public class ChatActivity extends AppCompatActivity {

    private RecyclerView mChatListView;    
    private DatabaseReference mDatabaseReference;
    private ChatListAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_chat);    

        mDatabaseReference = FirebaseDatabase.getInstance().getReference();           
        mChatListView = (RecyclerView) findViewById(R.id.chat_list_view);        
    }

    @Override
    public void onStart(){
        super.onStart();
        mAdapter = new ChatListAdapter(this, mDatabaseReference);
        mChatListView.setAdapter(mAdapter);
    }

    @Override
    public void onStop() {
        super.onStop();
        mAdapter.cleanUp();
    }
}

【问题讨论】:

  • 请发布您的完整代码,包括您的活动。
  • @RajshreeTiwari 包含活动的完整代码已添加。
  • 在 onChild 中添加这一行 mSnapshotList = new ArrayList&lt;&gt;();mSnapshotList.add(dataSnapshot); 之前添加
  • @PeterHaddad 该行已存在于 ChatListAdapter 构造函数中。
  • @John 如果您有兴趣,推荐使用 this 方法,您可以从 Firebase 实时数据库中检索数据并使用 @ 将其显示在 RecyclerView 中987654334@ 和 this 是您可以使用ArrayAdapter 的方法。

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

有两种方法可以解决这些问题。 This 是一种推荐的方式,您可以使用这种方式从 Firebase 实时数据库中检索数据,并使用 FirebaseRecyclerAdapter 将其显示在 RecyclerView 中,而 this 是这样的你可以使用ArrayAdapter

但请注意,为了使用这些答案,您需要添加 Firebase-UI 依赖项。请参阅here 最新版本。

【讨论】:

  • 如果您认为我的回答对您有所帮助,请考虑接受并投票。谢谢!
  • 如果其中一个答案对您特别有帮助,也请考虑给予投票。我会很感激的。谢谢!
【解决方案2】:
List<Insight> insightList = new ArrayList<>();
FirebaseData mFirebaseDatabase = FirebaseDatabase.getInstance().getReference(your reference key);
mFirebaseDatabase.addValueEventListener(new ValueEventListener() {
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {
         insightList.clear();
         for (DataSnapshot noteSnapshot:dataSnapshot.getChildren(){
               Insight note = noteSnapshot.getValue(Insight.class);
               insightList.add(note);
         }
         // pass list in recyclerview
       }
           @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage());
            }
        });

【讨论】:

    【解决方案3】:

    通过Map在数组列表中添加数据,推细节的例子

    从 Firebase 获取数据的以下方法:

    public void getUsers(){
        final ArrayList arrayList=new ArrayList();
        DatabaseReference q1=FirebaseDatabase.getInstance().getReference();
        q1.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                collectiouser((Map<String,Object>)dataSnapshot.getValue());
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
        toolbar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i=new Intent(ChatPage.this,FriendsProfile.class);
                i.putExtra("receiver",receiver);
                startActivity(i);
                finish();
            }
        });
    
    }
    

    将数据添加到列表中:

    private void collectiouser(Map<String, Object> value) {
        ArrayList<String> user=new ArrayList<>();
        for(Map.Entry<String,Object> entry : value.entrySet()){
            Map singleuser=(Map)entry.getValue();
            String u=entry.getKey();
            String s=singleuser.toString();
            user.add(u); // Add Data into List
        }
    }
    

    【讨论】:

    • 你没有初始化mSnapshotList,你需要像private ArrayList&lt;DataSnapshot&gt; mSnapshotList=new ArrayList&lt;&gt;();一样初始化你的数组列表
    • 我是在 ChatListAdapter 构造函数中完成的。
    • 在这种情况下在firebase的onDatachange事件中写入mAdapter = new ChatListAdapter(this, mDatabaseReference); mChatListView.setAdapter(mAdapter);代码
    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多