Строка дублирующегося списка, когда дочерний элемент добавлен или удален в Firebase RecyclerView - PullRequest
0 голосов
/ 09 мая 2018

Когда ребенок добавляется или удаляется в базе данных реального времени Firebase, я получаю строку списка дубликатов. Дубликат - это старая строка, когда добавляется новый дочерний элемент. Что бы это было?

Я избегаю прямого доступа к целевому дочернему элементу, так как планирую получить больше данных из разных частей, поэтому перебираю datasnapshot. Я думал, что это будет лучший вариант в моем случае.

Дочерний объект 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());


            }
        });

    }

}

1 Ответ

0 голосов
/ 09 мая 2018

Нашел решение. Все, что мне нужно было добавить, это osList.clear(); в методе переопределения onDataChange.

 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;
                ....
                ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...