Значение переменной сбрасывается в onBindViewHolder, так как я в первый раз прокручиваю свое представление рециркулятора - PullRequest
1 голос
/ 03 июля 2019

Основная идея того, что я делаю:

Я настраиваю свой вид переработчика из моего фрагмента «Категории», который отображает изображение продукта, его название, его цену исчетчик, который при нажатии изменяет количество этого конкретного элемента.У меня есть глобальная переменная totalQTY, определенная в моем ProductRecyclerViewAdapter, которая хранит общее количество всех продуктов в сгенерированном представлении переработчика и отправляет данные в метод внутри моего фрагмента «Категории».

Чтоэто проблема, с которой я сталкиваюсь?

Когда я в первый раз прокручиваю свое представление рециркулятора, totalQTY, который ранее обновлялся нормально, сбрасывается в 0. Однако когда я поднимаюсь отсюда и потомснова прокрутите вниз время, totalQTY теперь увеличивается, как и должно быть, и никогда не сбрасывается.Короче говоря, сброс происходит только тогда, когда прокручивается представление рециркулятора в первый раз.

Мой класс ProductRecyclerViewAdapter

public class ProductRecyclerViewAdapter extends RecyclerView.Adapter<ProductRecyclerViewAdapter.ProductViewHolder>{

    private Context context;
    private List<Product> productList;
    private CategoriesFragment fragment;
    private int totalQTY;
    private double totalPrice = 0;

 public ProductRecyclerViewAdapter(Context context, List<Product> productList, CategoriesFragment fragment) {
        this.context = context;
        this.productList = productList;
        this.fragment = fragment;
    }

    @NonNull
    @Override
    public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View view = inflater.inflate(R.layout.product_recyclerview_list_item,viewGroup,false);
        ProductViewHolder holder = new ProductViewHolder(view);
        return holder;
    }

@Override
    public void onBindViewHolder(final @NonNull ProductViewHolder prouctViewHolder, int i) {
        final Product product = productList.get(i);
        prouctViewHolder.pdtTitle.setText(product.getTitle());
        prouctViewHolder.pdtPrice.setText("MRP Rs " + String.valueOf(product.getPrice()));
        prouctViewHolder.pdtImageView.setImageDrawable(context.getResources().getDrawable(product.getImageId()));
        totalQTY = Integer.parseInt(prouctViewHolder.counter.getText().toString());   //Initially 0
        prouctViewHolder.qtyminus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int qty = Integer.parseInt(prouctViewHolder.counter.getText().toString());
                if (qty > 0) {
                    qty--;
                    totalPrice = totalPrice - product.getPrice();
                    totalQTY--;
                    fragment.setCheckoutToolbarText(totalQTY,totalPrice);
                    if(totalQTY==0) {
                        fragment.makeCheckoutGone();
                    }
                } else {
                    Toast.makeText(context, "Cannot have a negative quantity\nCAN YOU?", Toast.LENGTH_LONG).show();
                }
                prouctViewHolder.counter.setText(String.valueOf(qty));
            }
        });
        prouctViewHolder.qtyplus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int qty = Integer.parseInt(prouctViewHolder.counter.getText().toString());
                qty++;

                totalPrice += product.getPrice();

                totalQTY++
                prouctViewHolder.counter.setText(String.valueOf(qty));
                fragment.setCheckoutToolbarText(totalQTY,totalPrice);
                fragment.makeCheckoutVisible();

            }
        });

    }


    @Override
    public int getItemCount() {
        return productList.size();
    }

    class ProductViewHolder extends RecyclerView.ViewHolder {

        ImageView pdtImageView;
        TextView pdtTitle, pdtPrice, counter;
        Button qtyminus, qtyplus;

        public ProductViewHolder(@NonNull View itemView) {
            super(itemView);
            pdtImageView = itemView.findViewById(R.id.product_imageView);
            pdtTitle = itemView.findViewById(R.id.textViewTitle);
            pdtPrice = itemView.findViewById(R.id.textViewPrice);
            counter = itemView.findViewById(R.id.qty_counter);
            qtyminus = itemView.findViewById(R.id.qty_minus);
            qtyplus = itemView.findViewById(R.id.qty_plus);

        }

    }

Мой product_recycler_view_list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="135dp"
            android:background="@drawable/product_background"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            android:layout_marginTop="16dp">

            <ImageView
                android:id="@+id/product_imageView"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:layout_alignParentStart="true"
                android:layout_marginStart="16dp"
                android:layout_alignParentTop="true"
                android:layout_marginTop="25dp"
                android:scaleType="centerInside"
                android:background="@null"/>

            <TextView
                android:id="@+id/textViewTitle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginTop="16dp"
                android:layout_marginStart="16dp"
                android:layout_toEndOf="@id/product_imageView"
                android:text="Banana"
                android:fontFamily="@font/baloo"
                android:textSize="20sp"
                android:textColor="@color/colorAccent" />

            <TextView
                android:id="@+id/textViewPrice"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@id/textViewTitle"
                android:layout_marginStart="16dp"
                android:layout_toEndOf="@id/product_imageView"
                android:text="Rs 120"
                android:textStyle="bold"
                android:textColor="@color/green"/>
            <Button
                android:id="@+id/qty_minus"
                android:background="@null"
                android:text="-"
                android:textColor="@color/red"
                android:textSize="20sp"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_below="@+id/textViewPrice"
                android:layout_toEndOf="@id/product_imageView"
                android:layout_marginTop="16dp"/>

            <TextView
                android:id="@+id/qty_counter"
                android:text="0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textViewPrice"
                android:layout_toEndOf="@id/qty_minus"
                android:layout_marginTop="26dp"
                android:layout_marginEnd="16dp"
                android:layout_marginStart="16dp"/>

            <Button
                android:id="@+id/qty_plus"
                android:background="@null"
                android:text="+"
                android:textColor="@color/red"
                android:textSize="20sp"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:layout_below="@+id/textViewPrice"
                android:layout_toEndOf="@id/qty_counter"
                android:layout_marginTop="16dp"/>

        </RelativeLayout>


</LinearLayout>

**The individual recycler view item preview**

Ниже приведен метод внутри фрагмента категорий, который получает totalQTY из метода onBindViewHolder ProductRecyclerViewAdapter

public void setCheckoutToolbarText(int totalQTY, double totalPrice){
        Log.i("totalQTY",Integer.toString(totalQTY));

    }

В настоящее время я добавил 6 продуктов в свой список продуктов, и 4 отображаются на экране, остальные 2 отображаются при прокрутке вниз.Что я сделал для отладки, так это то, что я нажал на + счетчик каждого из 4 продуктов на экране по отдельности, поэтому totalQTY в журнале увеличился с 1 до 4.

Однако, когда я прокрутил вниз и нажал на5-й продукт, totalQTY сбрасывается в 0 внутри onBindViewHolder, обновляется по щелчку и отправляет 1 обратно в вышеуказанный метод вместо отправки 5. Затем я нажимаю на 6-м изображении, totalQTY становится 2. Затем я снова прокручиваю вверх икликнул по 1-м 4 продуктам, итого QTY стало 3,4,5,6.Затем, когда я снова прокрутил вниз, на этот раз totalQTY правильно показал 7,8 при нажатии на последние 2 продукта.

Следовательно, проблема, с которой я сталкиваюсь, возникает, только когда я прокручиваю вниз в первый раз ниже.

The Log.i

2019-07-03 10:11:32.311 17011-17011/com.example.gofresh I/totalQTY: 1
2019-07-03 10:11:34.150 17011-17011/com.example.gofresh I/totalQTY: 2
2019-07-03 10:11:35.996 17011-17011/com.example.gofresh I/totalQTY: 3
2019-07-03 10:11:39.659 17011-17011/com.example.gofresh I/totalQTY: 4
2019-07-03 10:11:41.015 17011-17017/com.example.gofresh I/example.gofres: Compiler allocated 4MB to compile void android.widget.TextView.<init>(android.content.Context, android.util.AttributeSet, int, int)
2019-07-03 10:11:41.956 17011-17011/com.example.gofresh I/totalQTY: 1
2019-07-03 10:11:51.176 17011-17011/com.example.gofresh I/totalQTY: 2
2019-07-03 10:11:53.421 17011-17011/com.example.gofresh I/totalQTY: 3
2019-07-03 10:11:56.142 17011-17011/com.example.gofresh I/totalQTY: 4
2019-07-03 10:11:57.337 17011-17011/com.example.gofresh I/totalQTY: 5
2019-07-03 10:11:58.545 17011-17011/com.example.gofresh I/totalQTY: 6
2019-07-03 10:11:59.902 17011-17011/com.example.gofresh I/totalQTY: 7
2019-07-03 10:12:01.352 17011-17011/com.example.gofresh I/totalQTY: 8

1 Ответ

1 голос
/ 03 июля 2019

Это из-за следующего кода:

@Override
public void onBindViewHolder(final @NonNull ProductViewHolder prouctViewHolder, int i) {
    final Product product = productList.get(i);
    prouctViewHolder.pdtTitle.setText(product.getTitle());
    ...

    // here is the problem.
    totalQTY = Integer.parseInt(prouctViewHolder.counter.getText().toString());

    ...
 }

Когда вы прокручиваете RecyclerView, Адаптер попытается создать другое дочернее представление для элемента.Следовательно, totalQTY всегда имеет значение 0, которое является текстовым значением по умолчанию вашего counter TextView.И это также произошло, когда ваш RecyclerView пытался повторно использовать и перерабатывать ваш дочерний элемент представления.

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