Android Firebase ChildEventListener返回相同数据的多个副本

Android 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

在片段中使用firebase addChildEventListener显示实时数据库中已更改的recycleview中的数据。但每次我从一个片段移动到另一个片段,并使用addChildEventListener返回片段时,都会添加多个侦听器,这会导致相同数据的重复副本

公共类列表扩展了片段{ ChildEventListener-mChildEventListener

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加载数据。尝试了它,但它没有解决我的问题。我已经包含了上面的代码