0

For my android project, I have used the recycle view in a layout which has 10+ view-holders each has a button and a text.

Whenever I click the button in the first item or view-holder, the 8th item is also auto clicked. And when I click the button in the 2nd one, the 9th button gets clicked.

So I searched this issue on google, then I found that this problem is a rare one. And I also got a solution for this type, but that solved my problem partially.

So I want to know whether it is a bug or my mistake??

CaptionedImagesAdapterMenu.java

package com.boredboy.atithikhana;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.annotation.NonNull;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.Toast;

import com.cepheuen.elegantnumberbutton.view.ElegantNumberButton;
import com.facebook.share.Share;

import java.util.Objects;


class CaptionedImagesAdapterMenu extends
        RecyclerView.Adapter<CaptionedImagesAdapterMenu.ViewHolder>{
    private String[] captions;
    private String[] foodName;
    private String[] desc;
    private String[] price;
    private Context context;
    private Listener listener;
    private Remover remover;
    private SparseBooleanArray hidebtns = new SparseBooleanArray();
    private SparseBooleanArray setnums = new SparseBooleanArray();


    public interface Remover{
        void onRemove(int position);
    }
    public interface Listener{
        void onClick(int position);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private CardView cardView;
        private Button button;
        private  ElegantNumberButton numberButton;
        public ViewHolder(CardView v) {
            super(v);
            cardView = v;
            this.button = v.findViewById(R.id.addbt);
            this.numberButton = v.findViewById(R.id.numberincdec);
        }
    }

    public CaptionedImagesAdapterMenu(Context context,String[] foodName, String[] desc,String[] captions, String[] price){
        this.context = context;
        this.foodName = foodName;
        this.captions = captions;
        this.desc = desc;
        this.price = price;
    }

    public void setListener(Listener listener){
        this.listener = listener;
    }
    public void setRemover(Remover remover){
        this.remover =remover;
    }
    @Override
    public int getItemCount(){
        return captions.length;
    }

    @Override
    public CaptionedImagesAdapterMenu.ViewHolder onCreateViewHolder(
            ViewGroup parent, int viewType){
        CardView cv = (CardView) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.card_captioned_image_menu, parent, false);;
        return new ViewHolder(cv);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") final int position){
        SharedPreferences preferences = context.getSharedPreferences("NEWV",0);
        SharedPreferences.Editor editor = preferences.edit();
        SharedPreferences prr = context.getSharedPreferences("ELEV",0);
        SharedPreferences.Editor editor1 = prr.edit();
        holder.button.setVisibility(hidebtns.get(position,false)?View.GONE:View.VISIBLE);
        holder.numberButton.setVisibility(hidebtns.get(position,false)?View.VISIBLE:View.GONE);
        String elval = prr.getString("elev","1");
        holder.numberButton.setNumber(Objects.requireNonNull(setnums.get(position) ? elval : "1"));
        CardView cardView = holder.cardView;
        TextView textView = cardView.findViewById(R.id.info_text);
        textView.setText(captions[position]);
        TextView textView1 = cardView.findViewById(R.id.info_menu);
        textView1.setText(desc[position]);
        TextView textView2 = cardView.findViewById(R.id.info_price);
        textView2.setText("₹ " + price[position]);
        TextView textView3 = cardView.findViewById(R.id.food_Info);
        textView3.setText(foodName[position]);

        holder.button.setOnClickListener(view -> {
            holder.button.setVisibility(View.GONE);
            holder.numberButton.setVisibility(View.VISIBLE);
            holder.numberButton.setNumber("1");
            hidebtns.put(position,true);
            setnums.put(position,false);
            editor.putString("newv", String.valueOf(holder.numberButton.getNumber()));
            editor.apply();
            if(listener!=null)
            {
              listener.onClick(position);
            }
        });


        holder.numberButton.setOnValueChangeListener((view, oldValue, newValue) -> {
            if (newValue < 1) {
                holder.button.setVisibility(View.VISIBLE);
                holder.numberButton.setVisibility(View.GONE);
                editor1.clear();
                editor1.putString("elev", String.valueOf(newValue));
                editor1.apply();
                hidebtns.put(position,false );
                setnums.put(position,true);
                if (remover != null)
                {
                    remover.onRemove(position);
                }
                editor.clear();
                editor.apply();
                }

            if (newValue > 0) {
                editor.putString("newv", String.valueOf(newValue));
                editor.apply();
                editor1.clear();
                editor1.putString("elev", String.valueOf(newValue));
                editor1.apply();
                hidebtns.put(position,true);
                setnums.put(position,true);
                if(listener!=null)
                {
                    listener.onClick(position);
                }
            }
        });


    }
    }



Pradeep
  • 798
  • 1
  • 7
  • 18
  • rare one huh, are you sure about this, check your code logic – hemen May 24 '19 at 11:24
  • 1
    It is not clicked in fact. That is the way RecyclerView works - it is recycling it's views. When view leaves screen on top of it, it is reused for view in the bottom of the screen. Therefore if your button modifies the view - you need to save it's state, and apply it in `onBindViewHolder` – Vladyslav Matviienko May 24 '19 at 11:25
  • Add your code here. – Mehul Solanki May 24 '19 at 11:34
  • @VladyslavMatviienko but when I have only 5 views, auto clicking is not happening!! why? – Pradeep May 24 '19 at 11:35
  • because the views are not going out of the screen to be recycled. Please go through some tutorial about `RecyclerView`before you continue – Vladyslav Matviienko May 24 '19 at 11:36
  • @VladyslavMatviienko yes I have to learn more about recycle view. But only 2 out of 5 views are visible in the screen, so recycling is not happening here uh? just a doubt. – Pradeep May 24 '19 at 11:43
  • any way - `When view leaves screen on top of it, it is reused for view in the bottom of the screen. Therefore if your button modifies the view - you need to save it's state, and apply it in onBindViewHolder` – Vladyslav Matviienko May 24 '19 at 11:45
  • Thank you. I have tried the saving state way. Partially done, works perfectly with visibility. But don't know how to do that with elegant number button!! – Pradeep May 24 '19 at 11:51
  • @VladyslavMatviienko actually I'm saving that in onBindviewholder. Is that wrong? – Pradeep May 27 '19 at 10:50

1 Answers1

0

As you know recyclerview recycle view for better performance. While watching your code there is some visibility changes in view of your viewholder.

Just give a try for this solution. Under onBindViewHolder add condition which checks data in your preference with respective your String.valueOf(holder.numberButton.getNumber()) and toggle visibility of your holder.button holder.numberButton view.

P Vartak
  • 434
  • 5
  • 17