Возникли проблемы в OnClickListener элемента RecyclerView - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть список предметов, которые находятся под RecyclerView. На любой предмет есть количество (сложение или вычитание). Когда выбрано добавление, количество должно увеличиться на единицу.

enter image description here

Но когда я впервые щелкнул «+», значение количества установка на 1 и вскоре после сброса на 0, но когда я нажимаю на второй раз, значение становится «1». Точно так же, когда я нажимаю в следующий раз, когда значение устанавливается на 2, и через долю секунды оно все еще становится равным 1, и я нажимаю на другое время, когда значение становится 2. Почему при первом щелчке не распознается? Может кто-нибудь, пожалуйста, помогите мне здесь?

public class ItemListAdapter  extends RecyclerView.Adapter<ItemListAdapter.ItemViewHolder>{

    private Context mContext;
    private List<Items> itemsList;
    private OnItemListListner onClick;

    public ItemListAdapter(Context mContext,List<Items> itemsList)
    {
        this.mContext=mContext;
        this.itemsList=itemsList;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(mContext);
        View view=inflater.inflate(R.layout.item_details_layout,null);
        return new ItemListAdapter.ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ItemViewHolder holder, final int position) {
        Items items=itemsList.get(position);
        Log.d("onBindViewHolder",items.getItemName());
        holder.itemNameTV.setText(items.getItemName());
        String strItemPrice=mContext.getResources().getString(R.string.Rs)+" "+String.valueOf(items.getItemPrice());
        holder.itemPriceTV.setText(strItemPrice);
        holder.itemDescTV.setText(items.getItemDescription());

        Glide.with(mContext).load(items.getItemImagePath()).into(holder.imageView);

        holder.itemAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int intCurrentQuantity=Integer.valueOf(holder.itemQuantity.getText().toString());
                intCurrentQuantity+=1;
                Log.d("myQuantity",String.valueOf(intCurrentQuantity));
                holder.itemQuantity.setText(String.valueOf(intCurrentQuantity));
                notifyItemChanged(holder.getAdapterPosition());
            }
        });


        holder.itemNameTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
        holder.itemPriceTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
        holder.itemDescTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
    }

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

    public void SetOnClick(OnItemListListner onClick)
    {
        this.onClick=onClick;
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView itemNameTV,itemPriceTV,itemDescTV,itemQuantity,itemSubtract,itemAdd;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView=itemView.findViewById(R.id.itemImageView);
            itemNameTV=itemView.findViewById(R.id.itemNameTextView);
            itemPriceTV=itemView.findViewById(R.id.itemPriceTextView);
            itemDescTV=itemView.findViewById(R.id.itemDescritionTextView);
            itemQuantity=itemView.findViewById(R.id.itemQuantity);
            itemSubtract=itemView.findViewById(R.id.subtractQuantity);
            itemAdd=itemView.findViewById(R.id.addQuantity);
        }
    }

    public interface OnItemListListner{
        void onItemListClick(int position);
    }

}

Ответы [ 4 ]

1 голос
/ 21 февраля 2020

Просмотрите ваш код, а затем, после того как я только что согласился с ответом Хар sh, есть два способа настройки вашего адаптера. Наиболее часто используемая модель для хранения и извлечения данных.

Вам необходимо создать один класс модели и сначала установить данные в модель, а затем получить данные из модели и установить их в свой адаптер / уведомить адаптер.

Вам необходимо создать одну переменную в классе модели, как показано ниже:

public class Item {
    String mQty = "";
    public String getmQty() {
        return mQty;
    }

    public void setmQty(String mQty) {
        this.mQty = mQty;
    }
}

Полезный ответ: Click Me

0 голосов
/ 21 февраля 2020

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

holder.itemAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int quantity = item[getAdapterPosition()].quantity;
quantity = quantity +1;
item[getAdapterPosition()].setQuantity(quantity);
notifyItemChanged(getAdapterPosition());
        }
    });

Спасибо. Я уверен, что это сработает для вас.

0 голосов
/ 21 февраля 2020

Представление Recycler перезапускает представления на свитке и сбрасывает его содержимое, поэтому необходимо сохранить переменную количества qty. Вы можете сделать это двумя способами

  1. Хранить количество внутри вашей Предметов модели.
  2. Сохранять количество отдельно HashMap как item.getId() как ключ и qty как значение.

затем получить и установить из объекта модели или хэш-карты.

0 голосов
/ 21 февраля 2020

Проверить обновленный код

 holder.itemAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int intCurrentQuantity=Integer.valueOf(holder.itemQuantity.getText().toString());
                ++intCurrentQuantity; //use this    
                Log.d("myQuantity",String.valueOf(intCurrentQuantity));
                holder.itemQuantity.setText(String.valueOf(intCurrentQuantity));
                notifyItemChanged(holder.getAdapterPosition());
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...