Android:Recycler查看项目快速单击它会使应用程序崩溃
我已经搜索了很多,我做的是创建一个项目列表简单的数字和复选框,这是选中和取消选中,所以当我点击快速列表它崩溃 并生成ArrayIndexOutOfBound异常 所以我不知道我做错了什么 这是我的密码 适配器类Android:Recycler查看项目快速单击它会使应用程序崩溃,android,android-recyclerview,Android,Android Recyclerview,我已经搜索了很多,我做的是创建一个项目列表简单的数字和复选框,这是选中和取消选中,所以当我点击快速列表它崩溃 并生成ArrayIndexOutOfBound异常 所以我不知道我做错了什么 这是我的密码 适配器类 class SingleListItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private TextView mItemDate, mFontSizeCategory;
class SingleListItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView mItemDate, mFontSizeCategory;
private ImageView isChecked, isTrack, isUnChecked;
private int fontSize = 13;
SingleListItemHolder(View v) {
super(v);
mFontSizeCategory = (TextView) v.findViewById(R.id.tv_font_size_category);
mItemDate = (TextView) v.findViewById(R.id.tv_recycler_view_list_header);
isChecked = (ImageView) v.findViewById(R.id.iv_recycler_view_list_item_selected);
isUnChecked = (ImageView) v.findViewById(R.id.iv_recycler_view_list_item_unselected);
isTrack = (ImageView) v.findViewById(R.id.iv_track);
v.setOnClickListener(this);
this.setIsRecyclable(false);
}
@Override
public void onClick(View v) {
mSingleItemListModels.get(pos).setSelected(false);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
pos = getAdapterPosition();
mSingleItemListModels.get(pos).setSelected(true);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
您必须在使用pos=getAdapterPosition()之前获取该项强>
@Override
public void onClick(View v) {
pos = getAdapterPosition();
mSingleItemListModels.get(pos).setSelected(false);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
mSingleItemListModels.get(pos).setSelected(true);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
上移
mSingleItemListModels.get(pos).setSelected(false);
您误用了
getAdapterPosition
。使用它来获取当前显示项目的索引不是一个好主意。更糟糕的是,如果您调用了适配器更改(使用notifyItemChanged
执行了两次),它也可能返回-1
请参阅文档
请注意,如果调用notifyDataSetChanged(),直到下一个布局过程,此方法的返回值将为NO_POSITION
无位置
的值为-1
。因此,与其在RecyclerView.ViewHolder
中实现ClickListener
,不如在onBindViewHolder
中实现它,因为这里有当前索引
在这里使用它
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
// the position will be the correct one
// but don't store the position in a class field
// since it may change during scrolling
}
您在getAdapterPosition()中获得了-1位置,因为当您快速单击时,它会在某个时间抛出-1位置
你可以看看这个
if (pos != RecyclerView.NO_POSITION) {
//Do your setting part
}
更改此代码
@Override
public void onClick(View v) {
mSingleItemListModels.get(pos).setSelected(false);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
pos = getAdapterPosition();
mSingleItemListModels.get(pos).setSelected(true);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
@Override
public void onClick(View v) {
mSingleItemListModels.get(pos).setSelected(false);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
pos = getAdapterPosition();
if (pos != RecyclerView.NO_POSITION) {
mSingleItemListModels.get(pos).setSelected(true);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
}
编码到
@Override
public void onClick(View v) {
mSingleItemListModels.get(pos).setSelected(false);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
pos = getAdapterPosition();
mSingleItemListModels.get(pos).setSelected(true);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
@Override
public void onClick(View v) {
mSingleItemListModels.get(pos).setSelected(false);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
pos = getAdapterPosition();
if (pos != RecyclerView.NO_POSITION) {
mSingleItemListModels.get(pos).setSelected(true);
notifyItemChanged(pos, mSingleItemListModels.get(pos));
}
}
引发异常的行是什么?mSingleItemListModels.get(pos).setSelected(true);它抛出错误onCLick的第一行应该是pos=getAdapterPosition();然后你可以访问ObjectsPosition,它是在我的适配器构造函数中设置的,它是全局的,我在onclick@AmjadkhanUp vote中把这段代码放在哪里,因为这是解决OP问题背后问题的唯一答案。OP的问题始于糟糕的代码设计。其他答案(包括公认的答案)是一个快速解决方案,但不能消除真正的问题。