Recycler View数据经过多次swipeToRefresh后重复

问题描述 投票:0回答:1

我正在Firebase中显示RecyclerView数据,并且工作正常。我还实现了一个SwipeRefreshLayout,当用户滑动它时,它正在从Firebase中获取最新数据,但是每当我多次滑动它时,它都会显示重复的值,尽管我正在清除ArrayList,并且我也在使用swipeRefresh.setEnabled(true)

这里我正在执行SwipeRefreshLayout

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {

                getData();

                if (swipeRefresh.isEnabled())
                    swipeRefresh.setEnabled(false);

            }
        });

这是我的getData()功能

    public void getData() {
        pd.setTitle("Loading Data");
        pd.setMessage("Please Wait...");
        pd.setCancelable(false);
        pd.show();

        infoList = new ArrayList<>();
        distributorList = new ArrayList<>();

        infoList.clear();
        distributorList.clear();

        countChilds = 0;
        counter = 0;
        final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference hotelRef = rootRef.child("Orders");
        hotelRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                final String key = String.valueOf(dataSnapshot.getKey());
                final String hotelName = String.valueOf(dataSnapshot.child("hotelName").getValue());
                final String location = String.valueOf(dataSnapshot.child("location").getValue());
                final String quantity = String.valueOf(dataSnapshot.child("quantity").getValue());
                final String time = String.valueOf(dataSnapshot.child("time").getValue());

                final DatabaseReference progressRef = rootRef.child("Progress").child(key);
                ValueEventListener eventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                            shipment = String.valueOf(dataSnapshot.child("shipment").getValue());
                            firstMile = String.valueOf(dataSnapshot.child("firstMile").getValue());
                            distributor = String.valueOf(dataSnapshot.child("distributor").getValue());
                        }
                        if (shipment.equals("1") && firstMile.equals("2") && !distributor.equals("2")) {
                            counter++;
                            Information information = new Information(key, hotelName, location, quantity, time);
                            infoList.add(information);
                            distributorList.add(distributor);

                            try {
                                adapter = new DistributorItemAdapter(infoList, distributorList, getContext(), DistributorListFragment.this);
                                recyclerView.setAdapter(adapter);
                            } catch (IndexOutOfBoundsException e) {
                                e.printStackTrace();
                            } catch (NullPointerException e) {
                                Toast.makeText(getContext(), "No more Orders", Toast.LENGTH_SHORT).show();
                                e.printStackTrace();
                            }

                        } else {
                            shipment = "";
                            distributor = "";
                            firstMile = "";
                        }

                        if (counter == 0) {
                            emptyView.setVisibility(View.VISIBLE);
                            recyclerView.setAdapter(null);
                        } else
                            emptyView.setVisibility(View.GONE);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Log.d("Database Error", databaseError.getMessage());
                    }
                };
                progressRef.addListenerForSingleValueEvent(eventListener);

                countChilds++;
                if (countChilds >= dataSnapshot.getChildrenCount()) {
                    if (pd.isShowing())
                        pd.dismiss();
                    if (!swipeRefresh.isEnabled())
                        swipeRefresh.setEnabled(true);
                    swipeRefresh.setRefreshing(false);

                }
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }

        });
    }
android firebase firebase-realtime-database android-recyclerview
1个回答
0
投票

您应该在onCreate中创建适配器,例如recylerview初始化

//recyclerView = findViewById.....

infoList = new ArrayList<>();
distributorList = new ArrayList<>();
adapter = new DistributorItemAdapter(infoList, distributorList, getContext(), DistributorListFragment.this);
recyclerView.setAdapter(adapter);

现在如下修改您的getData()

public void getData() {
  pd.setTitle("Loading Data");
  pd.setMessage("Please Wait...");
  pd.setCancelable(false);
  pd.show();

  infoList.clear();
  distributorList.clear();

  countChilds = 0;
  counter = 0;
  final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
  final DatabaseReference hotelRef = rootRef.child("Orders");
  hotelRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            final String key = String.valueOf(dataSnapshot.getKey());
            final String hotelName = String.valueOf(dataSnapshot.child("hotelName").getValue());
            final String location = String.valueOf(dataSnapshot.child("location").getValue());
            final String quantity = String.valueOf(dataSnapshot.child("quantity").getValue());
            final String time = String.valueOf(dataSnapshot.child("time").getValue());

           final DatabaseReference progressRef = rootRef.child("Progress").child(key);
           ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                   if (dataSnapshot.exists()) {
                       shipment = String.valueOf(dataSnapshot.child("shipment").getValue());
                       firstMile = String.valueOf(dataSnapshot.child("firstMile").getValue());
                       distributor = String.valueOf(dataSnapshot.child("distributor").getValue());
                   }
                   if (shipment.equals("1") && firstMile.equals("2") && !distributor.equals("2")) {
                        counter++;
                        Information information = new Information(key, hotelName, location, quantity, time);
                         infoList.add(information);
                         distributorList.add(distributor);

                         // notify your adapter that data set is changed
                         adapter.notifyDatasetChanged();

                        } else {
                            shipment = "";
                            distributor = "";
                            firstMile = "";
                        }

                        if (counter == 0) {
                            emptyView.setVisibility(View.VISIBLE);
                            recyclerView.setAdapter(null);
                        } else
                            emptyView.setVisibility(View.GONE);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Log.d("Database Error", databaseError.getMessage());
                    }
                };
                progressRef.addListenerForSingleValueEvent(eventListener);

                countChilds++;
                if (countChilds >= dataSnapshot.getChildrenCount()) {
                    if (pd.isShowing())
                        pd.dismiss();
                    if (!swipeRefresh.isEnabled())
                        swipeRefresh.setEnabled(true);
                    swipeRefresh.setRefreshing(false);

                }
            }

           //....

    });
}
© www.soinside.com 2019 - 2024. All rights reserved.