Search code examples
androidandroid-recyclerviewonitemclicklistener

Recyclerview occasionally becomes un-clickable in Android


I have this strange issue with a recycler view that is giving me a lot of headache. The rows in the recyclerView are clickable and in general things work. But once in a while they stop working and I no longer can click on a row on the recyclerView.

To produce this, I quickly toggle between two fragments (using a bottom navigation menu) one of which contains the recyclerView . After few times of doing this, the recyclerView stops responding. When I scroll the recyclerView up and down, the problem immediately fixes itself.

I was wondering if anyone can suggest where I should look to pinpoint the root cause.

Thanks a lot in advance

Here is my code for the recycleView:

public class KidItemAdapter extends RecyclerView.Adapter<KidItemAdapter.KidTaskViewHolder> {

private ArrayList<KidItem> mKidItems;
private OnItemClickListener mListener;
private int[] rainbow;


public interface OnItemClickListener {
    void onItemClick(int position);
    void onMenuClick(int position, View view);
}

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

public static class KidTaskViewHolder extends RecyclerView.ViewHolder {

    TextView textViewTaskDescription;
    TextView textViewTaskPoint;
    ImageView imageViewTaskMenu;
    CardView kidItemCardView;


    public KidTaskViewHolder(View itemView, OnItemClickListener listener) {
        super(itemView);
        textViewTaskDescription = itemView.findViewById(R.id.task_description_view);
        textViewTaskPoint = itemView.findViewById(R.id.task_point_view);
        imageViewTaskMenu = itemView.findViewById(R.id.task_menu_image_view);
        kidItemCardView = itemView.findViewById(R.id.kidItemCardView);

        kidItemCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (listener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        listener.onItemClick(position);
                    }
                }

            }
        });

        imageViewTaskMenu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = getAdapterPosition();
                if (position != RecyclerView.NO_POSITION && listener != null) {
                    listener.onMenuClick(position, imageViewTaskMenu);
                }
            }
        });
    }
}

public KidItemAdapter(ArrayList<KidItem> kidItems, Activity activity) {
    this.mKidItems = kidItems;
    rainbow = activity.getResources().getIntArray(R.array.rainbow);
}

@NonNull
@Override
public KidTaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.kid_item, parent, false);
    KidTaskViewHolder evh = new KidTaskViewHolder(v, mListener);
    return evh;
}

@Override
public void onBindViewHolder(@NonNull KidTaskViewHolder holder, int position) {
    KidItem currentKid = mKidItems.get(position);

    holder.textViewTaskDescription.setText(currentKid.getDescription());
    holder.textViewTaskPoint.setText(String.valueOf(currentKid.getPoints()));

    holder.kidItemCardView.setCardBackgroundColor(rainbow[currentKid.getDescription().length()%rainbow.length]);

    if (GlobalVars.appUser.isKidUser())
        holder.imageViewTaskMenu.setVisibility(View.INVISIBLE);

}

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

}


Solution

  • Try replacing getAdapterPosition with getLayoutPosition.