【问题标题】:Duplicate List Row When Child Added or Removed in Firebase RecyclerView在 Firebase RecyclerView 中添加或删除子项时重复列表行
【发布时间】:2018-05-08 21:44:27
【问题描述】:

当在 firebase 实时数据库中添加或删除子项时,我得到一个重复的列表行。重复的行是添加新子项时的旧行。会是什么?

我避免直接​​到达目标孩子,因为我打算从不同部分检索更多数据,所以我循环遍历数据快照。我认为这将是我的最佳选择。

DataSnapshot 孩子:dataSnapshot.getChildren()

这是我的计划:

Os osData = child.child("StaticData").child("os").getValue(Os.class);
Ram ramData = child.child("StaticData")..child("RAM").getValue(Ram.class)
...
...

这里是代码。

public class HomeActivity extends AppCompatActivity {

    private static final String TAG = "HomeActivity";
    SharedPreferences sharedPref;
    private String uid;
    private DatabaseReference databaseReference;
    private RelativeLayout emptyListPlaceHolder;

    List<Os> myList = new ArrayList<>();
    RecyclerView rv;
    HomeAdapter homeAdapter;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        ButterKnife.bind(this);
        rv = findViewById(R.id.recycler_view);
        databaseReference = FirebaseDatabase.getInstance().getReference();
        databaseReference.keepSynced(true);
        emptyListPlaceHolder = findViewById(R.id.home_activity_empty_placeholder);

        getSharedPref(); // Gets uid 

        getHomeData();

    }

    private void getHomeData() {

        DatabaseReference userStatsRef = databaseReference.child("stats").child(uid);

        userStatsRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                int i = 0;

                emptyListPlaceHolder.setVisibility(View.GONE);
                for (DataSnapshot child : dataSnapshot.getChildren()) {
                   Os osData = child
                            .child("StaticData")
                            .child("os")
                            .getValue(Os.class);

                    myList.add(i, osData);

                    i++;

                } // END for loop
                rv.setVisibility(View.VISIBLE);
                rv.setLayoutManager(new LinearLayoutManager(HomeActivity.this));
                rv.setHasFixedSize(false);
                homeAdapter = new HomeAdapter(myList);
                rv.setAdapter(homeAdapter);

            } // END onDataChange

            @Override
            public void onCancelled(DatabaseError error) {
                Log.w(TAG, "Failed to read value.", error.toException());


            }
        });

    }

}

【问题讨论】:

  • 请添加您的数据库结构。
  • @AlexMamo 添加
  • 请添加您实际数据库的截图,以便看得更清楚。
  • @AlexMamo 刚刚添加:)

标签: android firebase android-recyclerview


【解决方案1】:

找到了解决办法。我只需要在onDataChange 覆盖方法中添加osList.clear();

 private void getHomeData() {

        DatabaseReference userStatsRef = databaseReference.child("stats").child(uid);

        userStatsRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                osList.clear(); // This line solved the issue.

                int i = 0;
                ....
                ....

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 2018-05-23
    • 2018-09-06
    • 2011-01-23
    • 2013-09-19
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多