我有一个显示Firebase数据的RecyclerView
。我使用过setPersistenceEnabled(true);
。在线和网络上一切正常离线模式也是。但问题是,当我在离线模式下打开我的应用并将其连接到互联网时,RecyclerView
首先显示存储的数据和所有在线数据,但当我重新启动活动时,这个问题就消失了。
这是我在onCreate()
方法
list=new ArrayList<>();
databaseReference= FirebaseDatabase.getInstance().getReference("Pdata").child("cdata");
recyclerView= (RecyclerView)rootview.findViewById(R.id.festirecycler);
recyclerView.setHasFixedSize(true);
recyclerAdapter=new DisplayRecyclerAdapter(list,getContext());
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(recyclerAdapter );
loadRecyclerData();
// Inflate the layout for this fragment
return rootview;
}
private void loadRecyclerData() {
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot:dataSnapshot.getChildren()) {
String da=postSnapshot.getValue().toString();
list.add(da);
}
Collections.reverse(list);
recyclerAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
有什么建议吗? 感谢:)
答案 0 :(得分:1)
这种情况正在发生,因为您正在将连接从离线更改为在线,并在onDataChanges()
方法中再次添加数据
解决方法是在从onDataChanges()
添加之前清除数据:
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Clear here
list.clear()
for (DataSnapshot postSnapshot:dataSnapshot.getChildren()) {
String da=postSnapshot.getValue().toString();
list.add(da);
}
Collections.reverse(list);
recyclerAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 1 :(得分:0)
Firebase持久性不太可能与您的问题有关。
您更有可能错误地处理了Activity
或Fragment
生命周期,并且您看到上次运行应用时存在RecyclerView
中的数据。< / p>
您不分青红皂白地Add
将您的对象添加到列表中。您不是先检查它们是否已存在于其中,然后只更新现有对象(如果已存在)。