Muhammad Afzal
Muhammad Afzal

Reputation: 11

How to fix this issue in Recycler view?

I have a recycler view when clicked on the item VISIBLE hide seek bar for each item. the issue is when clicked on a single item then VISIBLE multiple hides seek bar and also when scrolling up down auto show randomly seek bar in this recycler view. help me. Thanks

See in this screenshot

Adapter class

public class Adapter_Custom extends RecyclerView.Adapter<Adapter_Custom.ViewHolder> {
    private Adapter_Custom.OnItemClickListener mListener;

    public interface OnItemClickListener {
        void onImageClick(int position,ImageView imageView,SeekBar seekBar);
        void onSeekBarProgressChange(int position,String progress);

    }

    public void setOnItemClickListener(Adapter_Custom.OnItemClickListener listener) {
        mListener = listener;
    }

    Context MyContext;
    List<Model_main> modelList;

    public Adapter_Custom(Context myContext, List<Model_main> modelList) {
        MyContext = myContext;
        this.modelList = modelList;
    }

    @NonNull
    @Override
    public Adapter_Custom.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(MyContext);
        View view = inflater.inflate(R.layout.rv_item_custom, null, false);
        return new Adapter_Custom.ViewHolder(view, mListener);
    }

    @Override
    public void onBindViewHolder(@NonNull final Adapter_Custom.ViewHolder holder, int position) {
        final Model_main model = modelList.get(position);
        holder.textView3.setText(model.getName());
        holder.sound_image.setImageResource(model.getImages());

    }

    @Override
    public int getItemCount() {
        return modelList.size();
    }
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView3;
        ImageView sound_image;
        SeekBar seekBar;


        public ViewHolder(@NonNull final View itemView, final Adapter_Custom.OnItemClickListener listener) {
            super(itemView);
            textView3 = itemView.findViewById(R.id.textView3);
            sound_image = itemView.findViewById(R.id.sound_image);
            seekBar = itemView.findViewById(R.id.seekBar);

            sound_image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onImageClick(position,sound_image,seekBar);
//                            Toast.makeText(MyContext, ""+position, Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                    if (listener != null) {
                        int position = getAdapterPosition();
                        if (position != RecyclerView.NO_POSITION) {
                            listener.onSeekBarProgressChange(position,String.valueOf(seekBar.getProgress()));
                        }
                    }
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });

        }
    }
}

ClickListner

 adapter_custom1.setOnItemClickListener(new Adapter_Custom.OnItemClickListener() {
                @Override
                public void onImageClick(int position, ImageView imageView, SeekBar seekBar) {

                    Toast.makeText(getContext(), "" + position, Toast.LENGTH_SHORT).show();
                    rv.findViewHolderForAdapterPosition(position).itemView.findViewById(R.id.seekBar)
                            .setVisibility(isVisible()? View.VISIBLE : View.GONE);

//                    rv.findViewHolderForAdapterPosition(position).itemView.findViewById(R.id.seekBar).setVisibility(View.VISIBLE);
//                    rv.findViewHolderForAdapterPosition(position).itemView.findViewById(R.id.textView3).setVisibility(View.GONE);
                    if (custom_btn_div.getVisibility() == View.GONE) {
                        custom_btn_div.setVisibility(View.VISIBLE);
                    }
                }

Upvotes: 0

Views: 213

Answers (1)

Zain
Zain

Reputation: 40888

Problem: Setting view visibility or checkbox check or drawable an ImageView to one or some of a RecyclerView items (rows).

Solution: You need to negate the opposite to remaining Views; e.g. If you set visiblity of a row item view to VISIBLE, then you've to make sure to set it as GONE/INVISIBLE to the similar items of the other rows.

Reason: Because the RecyclerView, as indicates from its name, recycles views; so if it needs to hold 100 items; and the screen size can hold 10 items at a time; then with the next scroll of the RecyclerView it doesn't create those items from the scrach, but copies the data of the new items into their place holds; if the data (visibility) is not set, then it takes the old data.

@Override
public void onBindViewHolder(@NonNull final Adapter_Custom.ViewHolder holder, int position) {
    final Model_main model = modelList.get(position);
    holder.textView3.setText(model.getName());
    holder.sound_image.setImageResource(model.getImages());

    holder.seekBar.setVisibility(View.GONE);
}

Upvotes: 1

Related Questions