android - 在 Firebase RecyclerView 中添加或删除子项时出现重复列表行

标签 android firebase android-recyclerview

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

我避免直接​​到达目标子项,因为我计划从不同部分检索更多数据,因此我循环访问数据快照。我认为这对于我的情况来说是最好的选择。

DataSnapshot child : 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());


            }
        });

    }

}

最佳答案

找到了解决方案。我需要添加的是 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;
                ....
                ....

关于android - 在 Firebase RecyclerView 中添加或删除子项时出现重复列表行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242675/

相关文章:

java - 扩展 BroadcastReceiver 的类不起作用

android - ActionBar.OnNavigationListener 弃用

Android - 从立体声 .mp3 中提取一个 channel ,通过 AudioStream 的两个 channel 应用它

android - Firebase 有不同的编译和运行版本

Android - 如何为 RecyclerView 添加虚线/点线分隔线?

android - RecyclerView onScrollChangeListener

android - 如果服务在另一个进程中,如何绑定(bind)服务?

ios - Xcode 10 iOS firebase firestore SDK——多个命令在 Firebase 中产生 gRPCCertificates.bundle 错误

javascript - 如何使用查询在 firestore 中保存地理点

java - 如何获取RecyclerView中点击项目的位置