【问题标题】:Recyclerview occasionally becomes un-clickable in AndroidRecyclerview 偶尔会在 Android 中无法点击
【发布时间】:2020-10-20 10:40:49
【问题描述】:

我在回收站视图中遇到了一个奇怪的问题,这让我很头疼。 recyclerView 中的行是可点击的,并且通常情况下工作正常。但有时它们会停止工作,我无法再单击 recyclerView 上的一行。

为了实现这一点,我在两个片段(使用底部导航菜单)之间快速切换,其中一个包含 recyclerView 。这样做几次后,recyclerView 停止响应。当我上下滚动 recyclerView 时,问题立即自行解决。

我想知道是否有人可以建议我应该在哪里查明根本原因。

提前非常感谢

这是我的 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();
}

}

【问题讨论】:

  • 用mxl和java的代码编辑你的问题
  • 请贴出你的RecyclerView片段和RV Adapter的代码

标签: android android-recyclerview onitemclicklistener


【解决方案1】:

尝试用 getLayoutPosition 替换 getAdapterPosition。

【讨论】:

    【解决方案2】:

    在扩展 RecyclerView.ViewHolder 之后的 KidTaskViewHolder 类中,还可以像下面那样实现 View.OnClickListener-

    public class KidTaskViewHolder extends  RecyclerView.ViewHolder implements View.OnClickListener {...
    

    不要为您的卡片视图使用 setOnClickListener,只需尝试覆盖 onClick 方法 在 KidTaskViewHolder 类中,如下所示,让我知道它是否有效-

    public static class KidTaskViewHolder extends RecyclerView.ViewHolder {
    
         TextView textViewTaskDescription;
         TextView textViewTaskPoint;
         ImageView imageViewTaskMenu;
         //CardView kidItemCardView;
    
     public KidTaskViewHolder(@NonNull View itemView) {
            super(itemView);
            itemView.setOnClickListener(this);
              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);
        }
    
        @Override
        public void onClick(View v) {
              int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        //(Do anything here)
                    }
         }
      }
    

    【讨论】:

    • 我对此进行了更多研究,我意识到正在发生的事情是“位置”变得等于 RecylceView.NO_POSITION。之后问题发生了。
    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2022-01-20
    相关资源
    最近更新 更多