java.lang.IndexOutOfBoundsException: когда я пытаюсь удалить элемент из списка переработчика - PullRequest
0 голосов
/ 30 декабря 2018

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

Вот мой код

public class CartAdapter extends RecyclerView.Adapter<CartViewHolder> {
    private List<Order> listData = new ArrayList<>();
    private CartActivity cartActivity;
    private int total;
    public CartAdapter(List<Order> listData, CartActivity cartActivity) {
        this.listData = listData;
        this.cartActivity = cartActivity;
    }

    @NonNull
    @Override
    public CartViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(cartActivity);
        View itemView = inflater.inflate(R.layout.cart_layout, viewGroup, false);
        return new CartViewHolder(itemView);
    }
    @Override
    public void onBindViewHolder(@NonNull final CartViewHolder cartViewHolder, @SuppressLint("RecyclerView") final int i) {
    cartViewHolder.counterButton.setNumber(listData.get(i).getQuantity());
        cartViewHolder.counterButton.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
            @Override
            public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) {
                total = 0;
                Order order = listData.get(i);
                order.setQuantity(String.valueOf(newValue));
                new Database(cartActivity).updateCart(order);
                calculate();
            }
        });

        cartViewHolder.txt_price.setText(listData.get(i).getPrice());
        cartViewHolder.txt_cart_name.setText(listData.get(i).getFoodName());
        cartViewHolder.removeItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listData.remove(i);
                notifyItemRemoved(i);
                notifyItemRangeChanged(i, listData.size());
                Order order = listData.get(i);
                new Database(cartActivity).clearItem(order);
                calculate();
            }
        });
    }
    private void calculate(){
        for (Order orders: listData){
            total += Integer.parseInt(orders.getPrice()) * Integer.parseInt(orders.getQuantity());
            Log.d("GDGDGD", String.valueOf(total));
        }
        int cgst = (total * 5)/100;
        total += cgst;
        Locale locale = new Locale("en","IN");
        NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
        cartActivity.txtTotalPrice.setText(fmt.format(total));
    }
}

Код вышеФрагмент из обзора переработчика, элемент, выбранный из базы данных, и составленный список.

1 Ответ

0 голосов
/ 30 декабря 2018

Проблема заключается в следующей строке: Order order = listData.get(i);

Сначала вы удаляете элемент, а затем пытаетесь получить заказ.

listData.remove(i); // remove item from listData: it will have zero items if earlier, listData had one item
...
Order order = listData.get(i); // get ith order: will crash if listData's size is 0

Размещение listData.remove(i); в концефункции решит проблему.

Например:

cartViewHolder.removeItem.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        notifyItemRemoved(i);
        notifyItemRangeChanged(i, listData.size());
        Order order = listData.get(i);
        new Database(cartActivity).clearItem(order);
        listData.remove(i);
        calculate();
    }
});

Редактировать:

Есть еще одна проблема в Calculate ().Вы должны переназначить переменную total на ноль.

Примерно так:

private void calculate(){
    total = 0;

    for (Order orders: listData){
        total += Integer.parseInt(orders.getPrice()) * Integer.parseInt(orders.getQuantity());
        Log.d("GDGDGD", String.valueOf(total));
    }
    int cgst = (total * 5)/100;
    total += cgst;
    Locale locale = new Locale("en","IN");
    NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
    cartActivity.txtTotalPrice.setText(fmt.format(total));
}

И удалить присвоение total = 0;.Как это:

    cartViewHolder.counterButton.setOnValueChangeListener(new ElegantNumberButton.OnValueChangeListener() {
        @Override
        public void onValueChange(ElegantNumberButton view, int oldValue, int newValue) {
            Order order = listData.get(i);
            order.setQuantity(String.valueOf(newValue));
            new Database(cartActivity).updateCart(order);
            calculate();
        }
    })
...