0
votes

Avoir le défi dans Recyclerview de l'article OnClickListener

J'ai une liste d'articles qui sont placées sous un recyclerview. Sur n'importe quel article, une quantité (ajout ou soustraire). Lorsque Ajouter est sélectionné, la quantité doit augmenter une.

 Entrez la description de l'image ici p>

mais quand j'ai cliqué sur '+' pour la première fois, la valeur de la quantité est réglé sur 1 et peu après la réinitialisation à 0, mais lorsque je clique sur la deuxième fois que la valeur est devenue «1». De même lorsque je clique sur la prochaine fois que la valeur est définie sur 2 et après une fraction de seconde, il est toujours possible de passer à 1 et je clique sur une autre fois que la valeur est en train de devenir 2. Pourquoi par clic n'est pas reconnu? Quelqu'un peut-il m'aider s'il vous plaît ici? P>

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 Réponses :


0
votes

Vérifiez le code mis à jour

 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());
            }
        });


1 commentaires

La valeur n'est pas mise à jour. Logiquement aussi ce qui précède peut ne pas fonctionner. Pouvez-vous s'il vous plaît expliquer ce que cela changera si préfixe l'incrément que ce que j'ai utilisé?



0
votes

La vue Recycler recycle les vues sur défilement et réinitialise son contenu. Vous devez donc persister la quantité Qté variable. Vous pouvez le faire de deux manières

  1. Nombre de magasins à l'intérieur de vos objets modèle.
  2. Quantité persist dans la séparation hashmap comme item.getid () comme clé et Qté comme valeur.

    puis obtenir et régler à partir de l'objet Model ou Hashmap.


2 commentaires

La deuxième approche m'a aidé. Merci d'avoir des idées.


Fondamentalement, le pire un: D




1
votes

Vous devez avoir la propriété Quantité dans la classe de modèle d'élément et devoir suivre le code que j'ai ajouté ci-dessous. XXX

Thank.Je suis sûr que cela fonctionnera pour vous. < / p>


2 commentaires

Merci d'avoir répondu. Ouais, à ce moment-là, je ne prévois pas de sauvegarder la quantité dans le modèle d'élément, car tout utilisateur de point sera affiché avec 0 quantité et + et - symboles pour tous les éléments. Lorsque vous avez cliqué sur ces symboles, nous devons mettre à jour la quantité. Donc, comme le dit dur ci-dessus, j'ai suivi HASHMAP pour stocker la position et la quantité actuelle. Lorsque l'utilisateur ajoute ou soustrait, les quantités sont mises à jour à partir du hashmap.


OK Pas de problème à votre logique, vous pouvez également filtrer pour montrer ou non à montrer la quantité mais qui dépend de votre logique.