【问题标题】:Android - items repeating in ListView when new child is addedAndroid - 添加新孩子时在 ListView 中重复的项目
【发布时间】:2020-04-04 06:08:54
【问题描述】:

我有一个自定义列表视图,其中显示了项目列表和每个项目的数量。我面临的问题是当我在列表中添加一个新项目时,它会重复列表中已经存在的项目。但是,当我更新列表中任何项目的数量时,它会完美显示。经过一些研究,我发现添加新项目时重复列表中已经存在的项目的原因 - 我在 onChildAdded() 方法中有 .notifyDataSetChanged() 。但是,当我在列表中添加新项目时,我不想重复这些项目。

代码片段:

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

        }
    });

}

知道我应该添加什么来解决这个问题吗?

【问题讨论】:

  • 你为什么评论这行? //arrayList.clear();
  • @MohammadMoeinGolchin 当我添加 arrayList.clear() 它没有显示我添加的新项目..
  • @MohammadMoeinGolchin 我发布了工作代码..

标签: android firebase android-studio firebase-realtime-database


【解决方案1】:

从 //arrayList.clear() 中删除注释;

【讨论】:

  • 我认为它会工作..但它没有显示我添加的新项目..
【解决方案2】:

在查看了我的代码后,我找到了解决方案。 编辑: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) {

        }
    });

}

【讨论】:

  • 很高兴听到您找到了解决方案,但也请提供一些解释。不要忘记将答案标记为已接受;)
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多