android - 来自 Firebase 的数据 - android 回收器 View 重新填充

标签 android android-fragments firebase firebase-realtime-database android-recyclerview

我很难解决这个回收器 View ,如果我的数据库发生变化,它会不断重新填充我的 fragment 中的 View 。这是我的回收站 View fragment ..

fragment .java @覆盖

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View v = inflater.inflate(R.layout.fragment_reviews, container, false);

    Toast.makeText(getContext(), "this is a review", Toast.LENGTH_SHORT).show();

    databaseReference = FirebaseDatabase.getInstance().getReference();
    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();

    //RETRIEVE DATAS
    loadEntries();

    drAdapter = new reviewAdapter(review);
    recyclerView = (RecyclerView) v.findViewById(R.id.reviewRecyvlerView);
    rvLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(rvLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(drAdapter);

    return v;
}

在我的 loadentries() 中

private void loadEntries(){
        review = new ArrayList<>();
        dbReference = FirebaseDatabase.getInstance().getReference().child("Review");
        dbReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {  
                for (DataSnapshot mySnapshot : dataSnapshot.getChildren()){

//                    System.out.println(dataSnapshot.getChildrenCount());
                    String userID = mySnapshot.getKey();
                    Review reviews = mySnapshot.getValue(Review.class);
                    String fname = (String) dataSnapshot.child(userID).child("firstname").getValue();
                    String lname = (String) dataSnapshot.child(userID).child("lastname").getValue();

                    review.setFName(fname);
                    review.setLName(lname);
                    review.add(reviews);
                }
                drAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

我认为这是因为我的 review.add(reviews) 不断填充 fragment (冗余)。如果我的数据库中有任何更改并且我不知道如何处理这种冗余,回收站 View 会添加另一个 View 。

任何替代解决方案或建议将不胜感激:)。愿意学习 :)。非常感谢。

最佳答案

您需要移动您的 review = new ArrayList<>(); 的声明在onDataChange()里面for循环开始之前的方法是这样的:

private void loadEntries(){
    dbReference = FirebaseDatabase.getInstance().getReference().child("Review");
    dbReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ArrayList review = new ArrayList<>();
            for (DataSnapshot mySnapshot : dataSnapshot.getChildren()){

                //System.out.println(dataSnapshot.getChildrenCount());
                String userID = mySnapshot.getKey();
                Review reviews = mySnapshot.getValue(Review.class);
                String fname = (String) dataSnapshot.child(userID).child("firstname").getValue();
                String lname = (String) dataSnapshot.child(userID).child("lastname").getValue();

                review.setFName(fname);
                review.setLName(lname);
                review.add(reviews);
            }
            drAdapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

希望对您有所帮助。

关于android - 来自 Firebase 的数据 - android 回收器 View 重新填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45330040/

相关文章:

android - 将 list_content 包含到列表布局中以保留 ListFragment 功能

android - 使用 FragmentStatePagerAdapter 从 ViewPager 中动态删除一个项目

ios - 无法设置 adSize 属性。空间不足,无法展示自定义尺寸的广告

javascript - Android - ProGuard 引起所有 JavascriptInterface 使用的警告

java - 即使尝试了 google 上找到的所有内容后,也无法将 eclipse ADT 更新到 23.0.3

javascript - 修改 alert() 标题(Android Webview 中的 Javascript)

java - 如何在Java中运行C代码

android - 从方向更改恢复时,DialogFragment onCreateDialog() 在 onServiceConnected() 之前被调用

java - 如何创建点击文本的处理程序?

firebase - 使用 react-native-firebase 在 React Native 上自定义通知