Android Firebase ChildEventListener返回相同数据的多个副本
在片段中使用firebase addChildEventListener显示实时数据库中已更改的recycleview中的数据。但每次我从一个片段移动到另一个片段,并使用addChildEventListener返回片段时,都会添加多个侦听器,这会导致相同数据的重复副本 公共类列表扩展了片段{ ChildEventListener-mChildEventListenerAndroid Firebase ChildEventListener返回相同数据的多个副本,android,firebase,firebase-realtime-database,fragment,Android,Firebase,Firebase Realtime Database,Fragment,在片段中使用firebase addChildEventListener显示实时数据库中已更改的recycleview中的数据。但每次我从一个片段移动到另一个片段,并使用addChildEventListener返回片段时,都会添加多个侦听器,这会导致相同数据的重复副本 公共类列表扩展了片段{ ChildEventListener-mChildEventListener private RecyclerView recyclerViewUsers; private ArrayList<Te
private RecyclerView recyclerViewUsers;
private ArrayList<Team> listUsers;
public static recycleview_adapter usersRecyclerAdapter;
private SQLiteDBHelper databaseHelper;
private SQLiteDBHelper sqd;
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("teams");
public list() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sqd = new SQLiteDBHelper(getActivity());
myRef = FirebaseDatabase.getInstance().getReference();
// myRef.removeEventListener(childEventListener);
if(mChildEventListener != null) {
myRef.removeEventListener(mChildEventListener);
}
mChildEventListener =myRef.child("teams").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
Team1 newPost = dataSnapshot.getValue(Team1.class);
System.out.println("Name: " + newPost.name);
System.out.println("Points: " + newPost.Points);
System.out.println(" ID: " + dataSnapshot.getKey());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {
Team1 newPost = dataSnapshot.getValue(Team1.class);
System.out.println("Name: " + newPost.name);
System.out.println("Points: " + newPost.Points);
System.out.println("ID : " + dataSnapshot.getKey());
sqd.InsertData(newPost.name,Integer.parseInt(newPost.Points));
if(list.super.isVisible()) {
initObjects();
}
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_list, container, false);
recyclerViewUsers = (RecyclerView) view.findViewById(R.id.recyclerViewUsers);
initObjects();
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
public void onDetach() {
super.onDetach();
if(mChildEventListener != null) {
myRef.removeEventListener(mChildEventListener);
}
}
private void initObjects() {
listUsers = new ArrayList<>();
usersRecyclerAdapter = new recycleview_adapter(listUsers);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
recyclerViewUsers.setLayoutManager(mLayoutManager);
recyclerViewUsers.setItemAnimator(new DefaultItemAnimator());
recyclerViewUsers.setHasFixedSize(false);
recyclerViewUsers.setAdapter(usersRecyclerAdapter);
databaseHelper = new SQLiteDBHelper(getActivity());
//divider
RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerViewUsers.getContext(),
linearLayoutManager.getOrientation());
recyclerViewUsers.addItemDecoration(dividerItemDecoration);
//
getDataFromSQLite();
}
private void getDataFromSQLite() {
// AsyncTask is used that SQLite operation not blocks the UI Thread.
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
databaseHelper = new SQLiteDBHelper(getActivity());
listUsers.clear();
listUsers.addAll(databaseHelper.getAllUser());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
usersRecyclerAdapter.notifyDataSetChanged();
}
}.execute();
}
@Override
public void onPause() {
super.onPause();
if (mChildEventListener != null) {
myRef.removeEventListener(mChildEventListener);
}
}
}
private recycleriew recycleriewuser;
私有ArrayList列表用户;
公共静态recycleview_适配器用户RecycleAdapter;
私有SQLiteDBHelper数据库helper;
私有SQLiteDBHelper sqd;
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference myRef=database.getReference(“团队”);
公开名单(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sqd=新的SQLiteDBHelper(getActivity());
myRef=FirebaseDatabase.getInstance().getReference();
//myRef.removeEventListener(childEventListener);
if(mChildEventListener!=null){
myRef.removeEventListener(mChildEventListener);
}
mChildEventListener=myRef.child(“团队”).addChildEventListener(新的ChildEventListener()){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串prevChildKey){
Team1 newPost=dataSnapshot.getValue(Team1.class);
System.out.println(“名称:“+newPost.Name”);
System.out.println(“点数:+newPost.Points”);
System.out.println(“ID:+dataSnapshot.getKey());
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串prevChildKey){
Team1 newPost=dataSnapshot.getValue(Team1.class);
System.out.println(“名称:“+newPost.Name”);
System.out.println(“点数:+newPost.Points”);
System.out.println(“ID:+dataSnapshot.getKey());
InsertData(newPost.name,Integer.parseInt(newPost.Points));
if(list.super.isVisible()){
initObjects();
}
}
@凌驾
公共void onChildRemoved(DataSnapshot DataSnapshot){}
@凌驾
public void onChildMoved(DataSnapshot DataSnapshot,字符串prevChildKey){}
@凌驾
已取消的公共void(DatabaseError DatabaseError){}
});
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u列表,容器,false);
RecycleWebUsers=(RecycleWebView)view.findViewById(R.id.RecycleWebUsers);
initObjects();
返回视图;
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
}
公共无效连接(){
super.onDetach();
if(mChildEventListener!=null){
myRef.removeEventListener(mChildEventListener);
}
}
私有void initObjects(){
listUsers=新的ArrayList();
usersRecyclerAdapter=新的recycleview_适配器(listUsers);
RecyclerView.LayoutManager mLayoutManager=新的LinearLayoutManager(getContext());
LinearLayoutManager LinearLayoutManager=新的LinearLayoutManager(getContext());
RecycleServiceWUsers.setLayoutManager(MLLayoutManager);
setItemAnimator(新的DefaultItemAnimator());
RecycleServiceWUsers.setHasFixedSize(false);
setAdapter(usersRecyclerAdapter);
databaseHelper=newsqlitedbhelper(getActivity());
//分隔器
RecycleView.ItemDecoration dividerItemDecoration=新的dividerItemDecoration(RecycleServiceWUsers.getContext(),
linearLayoutManager.getOrientation());
回收服务。附加装饰(分割装饰);
//
getDataFromSQLite();
}
私有void getDataFromSQLite(){
//AsyncTask用于确保SQLite操作不会阻塞UI线程。
新建异步任务(){
@凌驾
受保护的Void doInBackground(Void…参数){
databaseHelper=newsqlitedbhelper(getActivity());
listUsers.clear();
addAll(databaseHelper.getAllUser());
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
usersRecyclerAdapter.notifyDataSetChanged();
}
}.execute();
}
@凌驾
公共无效暂停(){
super.onPause();
if(mChildEventListener!=null){
myRef.removeEventListener(mChildEventListener);
}
}
}
尝试setAdapter(null)
然后再次加载数据或saveState
片段在附加新侦听器之前,请确保删除以前的事件侦听器
databaseRef.removeEventListener(childEventListener);
您可以在ondeach()方法中删除侦听器
@Override
public void onDetach() {
super.onDetach();
databaseRef.removeEventListener(childEventListener);
}
一旦数据在服务器中被更改,它就被保存到本地sqlite数据库中,然后recycleview加载数据。尝试了它,但它没有解决我的问题。我已经包含了上面的代码