【问题标题】:data from Firebase - android recycler view repopulation来自 Firebase 的数据 - android recycler 视图重新填充
【发布时间】:2018-01-01 23:00:12
【问题描述】:

如果我的数据库发生更改,我很难解决如何解决此回收器视图,该视图会继续在我的片段中重新填充视图。这是我的回收站视图片段..

片段.java @Override

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) 不断填充片段(冗余)。如果我的数据库中有任何更改并且我不知道如何处理这种冗余,回收站视图会添加另一个视图。

非常感谢任何替代解决方案或建议:)。肯学习 :)。非常感谢。

【问题讨论】:

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


    【解决方案1】:

    在 for 循环开始之前,您需要将 review = new ArrayList&lt;&gt;(); 的声明移动到 onDataChange() 方法中,如下所示:

    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) {
    
            }
        });
    }
    

    希望对你有帮助。

    【讨论】:

    • 它返回尝试在 public int getItemCount(){return mReviews.size();} 上调用虚拟方法的尝试,谢谢,感谢 :)。
    猜你喜欢
    • 2016-12-13
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2021-08-05
    相关资源
    最近更新 更多