迭代两个ArrayLists,使用新列表

时间:2017-05-27 22:56:54

标签: java android arraylist iterator

我有三个ArrayLists。一个是RecyclerView.Adapter正在显示的产品列表。这个叫做productList。第二个名为cartItems的列表,它基本上包含用户从productList中选择的所有产品。第三个叫做updatedCart,它包含购物车的所有更新值。我的目标是使用updatedCart列表更新我的cartItems和productList。我是通过比较productIds来做到这一点的。如果它们相等,我更新一个名为counter的值,否则我将其删除。但是,我一直遇到IllegalStateException。我也不是100%肯定我的逻辑。

这是我从updatedCart更新productList和cartItems的方法。

public void updateCartItems(ArrayList<Product> updatedCart) {

    // "productList" is a full list of products that the adapter displays
    // "cartItems" is a list of items user adds to the cart
    // "updatedCart" is a list of updated cart items (user can remove an item or increase the number of items he's purchasing)
    // i want the original "cartItems" and "productList" to update it's values according to the "updatedCart"
    if (updatedCart.size() == 0) {
        Iterator<Product> productIterator = cartItems.iterator();
        while (productIterator.hasNext()) {
            Product product = productIterator.next();
            productIterator.remove();
        }
        for (Product listProduct : productList) {
            listProduct.setCounter(0);
        }
    } else {
        Iterator<Product> productIterator = cartItems.iterator();
        while (productIterator.hasNext()) {
            Product product = productIterator.next();
            for (Product cartProduct : updatedCart) {
                if (cartProduct.getProductId() != product.getProductId()) {
                    productIterator.remove();
                } else {
                    product.setCounter(cartProduct.getCounter());
                }
            }
        }
        for (Product listProduct : productList) {
            for (Product cartProduct : cartItems) {
                if (listProduct.getProductId() == cartProduct.getProductId()) {
                    listProduct.setCounter(cartProduct.getCounter());
                } else {
                    listProduct.setCounter(0);
                }
            }
        }
    }
    notifyDataSetChanged();
}

这是我得到的错误

05-28 03:25:31.769 23280-23280/com.innovationsquare.organicshuttle E/InputEventSender: Exception dispatching finished signal.
05-28 03:25:31.769 23280-23280/com.innovationsquare.organicshuttle E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
05-28 03:25:31.771 23280-23280/com.innovationsquare.organicshuttle E/MessageQueue-JNI: java.lang.IllegalStateException

错误显示在productIterator.remove()块的else行。除了摆脱这个错误,我还想知道我的逻辑在这里是否合理。 帮助我stackoverflow,你是我唯一的希望。

1 个答案:

答案 0 :(得分:0)

Fisrt all,第三个arraylist的目的是什么?如果用户更新(添加&删除&#39; s来自cartitems的东西),那么更新该cartitem列表...为什么要使用其他arraylist? 其次,你正在制作一个非常复杂的逻辑,直到你不能用每一个细节来描述完整的场景,例如productlist是一个包含产品数据的阵列(所有产品都显示用户),为什么要更新那个清单? 所以,尽量保持简单。制定另一个逻辑,在用户更新购物车后立即尝试更新productlist和cartitem。