数据显示在RecycleView但是当我想要计算列表的大小时显示null(android)

时间:2017-12-22 05:13:59

标签: android list android-recyclerview

我对列表有疑问。我有一个列表,可以保存多个数据。然后,当我运行我的应用程序时,它工作并显示数据。但是当我调试并想要检查我的列表的大小时,只显示0的大小。问题是什么? 请帮忙。

这是我的代码:

 query.addValueEventListener(new com.firebase.client.ValueEventListener() {
                        @Override
                        public void onDataChange(com.firebase.client.DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                for (com.firebase.client.DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                                    SisaKendaraanModel sisaModel = postSnapshot.getValue(SisaKendaraanModel
                                    if (//somecondition) {
                                        if (//somecondition) {
                                            kendaraanModel.add(kendaraan);
                                            adapter.notifyDataSetChanged();

                                        } else {
                                           kendaraanModel.remove(kendaraan);
                                           adapter.notifyDataSetChanged();
                                            break;
                                        }
                                    } else {
                                        if (//somecondition) {
                                            kendaraanModel.add(kendaraan);
                                            adapter.notifyDataSetChanged();

                                        } else {
                                           kendaraanModel.remove(kendaraan);
                                            adapter.notifyDataSetChanged();
                                            break;
                                        }
                                    }
                                }
                            } else {
                                if (//somecondition) {
                                    kendaraanModel.add(kendaraan);
                                    adapter.notifyDataSetChanged();
                                } else {
                                    kendaraanModel.remove(kendaraan);
                                    adapter.notifyDataSetChanged();
                                }
                            }
                        }

                        @Override
                        public void onCancelled(FirebaseError firebaseError) {

                        }
                    });

                }

            } else {
            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }


    });
    long sizeKendaraanModel = kendaraanModel.size(); // it show 0

    adapter = new MenuHasilPencarianAdapter(MenuHasilPencarian.this, kendaraanModel, tanggalSewaPencarian, tanggalKembaliPencarian, jumlahKendaraanPencarian);
    recyclerView.setAdapter(adapter);

这是我的调试结果:

2 个答案:

答案 0 :(得分:0)

这是因为你正在" kendaraanModel"中添加价值。初始化Recycler之后 并且在" kendaraanModel"中添加值之后,您已添加> adapter.notifyDataSetChanged();即影响清单.. 所以,

  

如果你想检查大小你可以在" OnDataChange"

中查看它

答案 1 :(得分:0)

看到您正在进行异步调用addValueEventListener。您的代码将在设置监听器之后立即调用。

long sizeKendaraanModel = kendaraanModel.size();

因此,每次使其按顺序调用时,这将给出0大小。未调用的onDataChange导致其异步调用。  你可以匹配这个场景,当我们开始和新线程及其在自己的流程中运行时(run()方法)然后我们必须等待响应。  所以你能做的就是。

 query.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot != null) {

                        // Add remove your value here
                    }
        long sizeKendaraanModel = kendaraanModel.size();
                    adapter = new MenuHasilPencarianAdapter(MenuHasilPencarian.this, kendaraanModel, tanggalSewaPencarian, tanggalKembaliPencarian, jumlahKendaraanPencarian);
                    recyclerView.setAdapter(adapter);

                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });

同样在你的代码中,我看到很多adapter.notifyDataSetChanged();。如果您正在使用回收站视图notifyDataSetChanged(),那么只需通知列表进行更改即可。所以请使用。

notifyItemRangeChanged()

notifyItemChanged()

notifyItemInserted()

notifyItemRemoved()