Одно нажатие кнопки вызывает другую кнопку в Android RecyclerView - PullRequest
0 голосов
/ 26 июня 2018

В настоящее время я работаю над приложением для электронной коммерции для Android.В моем обзоре переработчиков 13 продуктов динамически заполняются из базы данных.Когда я нажимаю первую кнопку в списке, она также меняет текст кнопки 11-й кнопки списка (я кодировал, чтобы изменить текст кнопки с Добавить на Удалить при нажатии кнопки).Аналогично нажатию 2-й кнопки изменяется текст 12-й кнопки просмотра.В журнале я заметил, что обе кнопки имеют одинаковое значение памяти.Что-то я делаю не так?

Вот журнал, сгенерированный за 3 разных нажатия кнопок (1-я, 11-я и 2-я кнопки):

android.support.v7.widget.AppCompatButton{9b877fd VFED..C.. ...P.... 740,120-1010,240 #7f090024 app:id/button}
android.support.v7.widget.AppCompatButton{9b877fd VFED..C.. ...P.... 740,120-1010,240 #7f090024 app:id/button}
android.support.v7.widget.AppCompatButton{b7dcb1b VFED..C.. ...P.... 740,120-1010,240 #7f090024 app:id/button}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    Glide.with(mContext)
            .asBitmap()
            .load(productsList.get(position).getImage())
            .into(holder.imageView);

    holder.itemname.setText(productsList.get(position).getName());
    holder.itemprice.setText(productsList.get(position).getPrice());
    holder.itemprice_g.setText(productsList.get(position).getPrice_g());

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position1 = holder.getAdapterPosition();
            if(!productsList.get(position1).isAddedTocart())
            {
                productsList.get(position1).setAddedTocart(true);
                String x = productsList.get(position1).getName().toString();
                Log.i("log",""+holder.button);
                holder.button.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
                holder.button.setPadding(0,0,0,0);
                holder.button.setText("Remove");

                ((AddorRemoveCallbacks)mContext).onAddProduct();

            }
            else
            {
                productsList.get(position1).setAddedTocart(false);
                holder.button.setText("Add");
                holder.button.setPadding(12,0,0,0);
                holder.button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_shopping_cart_black_24dp, 0, 0, 0);
                ((AddorRemoveCallbacks)mContext).onRemoveProduct();
            }
        }
    });
}

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

зачем использовать "int position1 = holder.getAdapterPosition ();"когда вы уже получили положение в bindholder, попробуйте удалить его и использовать положение по умолчанию.

0 голосов
/ 26 июня 2018

Попробуйте, сначала инициализируйте переменную в классе держателя адаптера. скажем, ваш продукт-имя-класса-класса; Я думаю, ProductList product;Затем попробуйте внести следующие изменения в onBindViewHolder.

     @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
holder.product = productList.get(position);
        Glide.with(mContext)
                .asBitmap()
                .load(holder.product.getImage())
                .into(holder.imageView);

        holder.itemname.setText(holder.product.getName());
        holder.itemprice.setText(holder.product.getPrice());
        holder.itemprice_g.setText(holder.product.getPrice_g());

        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!holder.product.isAddedTocart())
                {
                    holder.product.setAddedTocart(true);
                    String x = holder.product.getName().toString();
                    Log.i("log",""+holder.button);
                    holder.button.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
                    holder.button.setPadding(0,0,0,0);
                    holder.button.setText("Remove");

                    ((AddorRemoveCallbacks)mContext).onAddProduct();

                }
                else
                {
                    holder.product.setAddedTocart(false);
                    holder.button.setText("Add");
                    holder.button.setPadding(12,0,0,0);
                    holder.button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_shopping_cart_black_24dp, 0, 0, 0);
                    ((AddorRemoveCallbacks)mContext).onRemoveProduct();
                }
            }
        });
    }
0 голосов
/ 26 июня 2018

В onBindViewHolder вы должны сначала инициализировать состояние holder.button, перед setOnClickListener, например:

...
holder.itemname.setText(productsList.get(position).getName());
holder.itemprice.setText(productsList.get(position).getPrice());
holder.itemprice_g.setText(productsList.get(position).getPrice_g());

if (productsList.get(position1).isAddedTocart()) {
    holder.button.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
    holder.button.setPadding(0,0,0,0);
    holder.button.setText("Remove");
} else {
    holder.button.setText("Add");
    holder.button.setPadding(12,0,0,0);
    holder.button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_shopping_cart_black_24dp, 0, 0, 0);
}

holder.button.setOnClickListener(new View.OnClickListener() {
...
0 голосов
/ 26 июня 2018

Использование ViewHolder с RecyclerView

https://www.androidhive.info/2016/01/android-working-with-recycler-view/

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