我有一个列表视图,该列表视图接收对象的数组列表并显示在屏幕上,该对象数组列表取自firebase中的数据库,当我从数据库中添加或删除文档(对象)时,列表视图正常更新,但是当我修改了一个对象字段(文档),列表视图完全在视图中重新创建了该对象,并且每次修改状态字段时都会“复制”。
这是我的代码,用于填充列表视图:
usuarios.orderBy("likes", Query.Direction.DESCENDING);
try {
usuarios.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w("Não consegue", "listen:error", e);
return;
}
for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
switch (dc.getType()) {
case ADDED:
Log.d("TAG", "New Msg: " + dc.getDocument().toObject(Doenca.class));
doenca = dc.getDocument().toObject(Doenca.class);
doencaArrayList.add(doenca);
break;
case REMOVED:
Log.d("TAG", "Removed Msg: " + dc.getDocument().toObject(Doenca.class));
doenca = dc.getDocument().toObject(Doenca.class);
doencaArrayList.add(doenca);
break;
case MODIFIED:
// doencaArrayList.remove(doencaArrayList.lastIndexOf(doenca));
Log.d("TAG", "Modified: " + dc.getDocument().toObject(Doenca.class));
doenca = dc.getDocument().toObject(Doenca.class);
doencaArrayList.add(doenca);
break;
}
}
ListView listView = (ListView) root.findViewById(R.id.recyclerViewCadPat);
ArrayAdapter adapter = new DoencaAdapter(getActivity(), doencaArrayList);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
}catch (NullPointerException e){
Toast.makeText(getActivity(), "Erro interno", Toast.LENGTH_SHORT).show();
}
请注意,共有3种状态,一种是添加(所有),删除(所有),另一种是修改(这会使listview复制对象)。
当在Firebase数据库中更新特定数据时,将调用EventListener的onEvent,并且您的列表将获得更新的值,但它仍然具有旧值。因此,首先清除列表,然后在onEvent方法中向其中添加数据。