Android - элементы, повторяющиеся в ListView при добавлении нового дочернего элемента - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть пользовательский вид списка, который показывает список предметов и количество каждого предмета. Проблема, с которой я сталкиваюсь, заключается в том, что когда я добавляю новый элемент в список, он повторяет элементы, которые уже присутствовали в списке. Тем не менее, когда я обновляю количество любого из элементов в списке, это показывает отлично. Проведя некоторое исследование, я обнаружил, что причина повторения элементов, уже присутствующих в списке, при добавлении нового элемента - у меня .notifyDataSetChanged () в методе onChildAdded (). Но я не хочу повторять эти элементы, когда добавляю новые элементы в список.

Фрагмент кода:

public void displayToList(final String orderID, final String tableID, final String restaurantID) {

    final OrderDetailsholder orderDetailsholder = new OrderDetailsholder(OrderDetailsActivity.this, R.layout.order_details_layout, arrayList);
    orderDetailsList.setAdapter(orderDetailsholder);

    DatabaseReference activeOrders = FirebaseDatabase.getInstance().getReference("activeOrders");
    Query ordersQuery = activeOrders.child(restaurantID).child(tableID).child(orderID);
    ordersQuery.keepSynced(true);
    ordersQuery.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            //arrayList.clear();

            String dishName = dataSnapshot.child("productName").getValue(String.class);
            int dishQty = dataSnapshot.child("productQuantity").getValue(Integer.class);

            activeOrdersObj = new ActiveOrders(dishName, dishQty);
            arrayList.add(activeOrdersObj);

            orderDetailsholder.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {


            String dishName = dataSnapshot.child("productName").getValue(String.class);
            int dishQty = dataSnapshot.child("productQuantity").getValue(Integer.class);

            activeOrdersObj = new ActiveOrders(dishName, dishQty);
            arrayList.add(activeOrdersObj);

            orderDetailsholder.clear();

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

Есть идеи о том, что мне добавить, чтобы решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Я нашел решение, пройдя мой код. EDIT : ArrayList необходимо очищать каждый раз, когда он загружается, а не onChildAdded (). Ниже приведен рабочий код:

public void displayToList(final String orderID, final String tableID, final String restaurantID) {

    final OrderDetailsholder orderDetailsholder = new OrderDetailsholder(OrderDetailsActivity.this, R.layout.order_details_layout, arrayList);
    orderDetailsList.setAdapter(orderDetailsholder);

    arrayList.clear();

    DatabaseReference activeOrders = FirebaseDatabase.getInstance().getReference("activeOrders");
    Query ordersQuery = activeOrders.child(restaurantID).child(tableID).child(orderID);
    ordersQuery.keepSynced(true);
    ordersQuery.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            String dishName = dataSnapshot.child("productName").getValue(String.class);
            int dishQty = dataSnapshot.child("productQuantity").getValue(Integer.class);

            activeOrdersObj = new ActiveOrders(dishName, dishQty);
            arrayList.add(activeOrdersObj);

            orderDetailsholder.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {


            String dishName = dataSnapshot.child("productName").getValue(String.class);
            int dishQty = dataSnapshot.child("productQuantity").getValue(Integer.class);

            activeOrdersObj = new ActiveOrders(dishName, dishQty);
            arrayList.add(activeOrdersObj);

            orderDetailsholder.clear();

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}
0 голосов
/ 04 апреля 2020

удалить комментарий из //arrayList.clear();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...