Recyclerview 在 Android 中偶尔会变得不可点击
Recyclerview occasionally becomes un-clickable in Android
我有一个关于回收站视图的奇怪问题,这让我很头疼。 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();
}
}
在你的 KidTaskViewHolder class 扩展后 RecyclerView.ViewHolder 也实现 View.OnClickListener 如下 -
public class KidTaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {...
不要为您的卡片视图使用 setOnClickListener,而是尝试重写 onClick 方法
在 KidTaskViewHolder Class 中,如下所示,让我知道它是否有效-
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)
}
}
}
尝试用 getLayoutPosition 替换 getAdapterPosition。
我有一个关于回收站视图的奇怪问题,这让我很头疼。 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();
}
}
在你的 KidTaskViewHolder class 扩展后 RecyclerView.ViewHolder 也实现 View.OnClickListener 如下 -
public class KidTaskViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {...
不要为您的卡片视图使用 setOnClickListener,而是尝试重写 onClick 方法 在 KidTaskViewHolder Class 中,如下所示,让我知道它是否有效-
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)
}
}
}
尝试用 getLayoutPosition 替换 getAdapterPosition。