我的应用程序位于前台。并且recyclerview列表中有2个项目。每当我从列表中删除第二项,然后单击第一项时,我的应用就会崩溃。在Logcat中,我收到类似-java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
的错误。但是,当我从列表中删除第一项,然后单击其余的第二项时,我的应用程序运行正常。
public void onClick(View v) {
onClick.onItemCli(position, banners.get(position));
}
我尝试使用这种方法在位置-1进行尝试,如下面的代码所示。
public void onClick(View v) {
onClick.onItemCli(position-1, banners.get(position-1));
}
但是在这种情况下,只要列表中有2个项目,我的应用程序就会崩溃,而我单击第2个项目。
我得到的错误是:
java.lang.ArrayIndexOutOfBoundsException:length = 12;索引= -1
public class HeaderSliderAdapter extends RecyclerView.Adapter<HeaderSliderAdapter.ViewHolder> {
public List<Banner> banners;
public Context context;
private OnItemClicked onClick;
public HeaderSliderAdapter(Context context, List<Banner> banners) {
this.banners = banners;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.home_header, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final HeaderSliderAdapter.ViewHolder holder, final int position) {
if (TextUtils.isEmpty(banners.get(position).getmSliderImage())) {
holder.mSliderImageView.setImageResource(R.drawable.no_img_ava);
holder.mBackgroundImage.setVisibility(View.GONE);
} else {
Picasso.with(context)
.load(banners.get(position).getmSliderImage())
.fit()
.into(holder.mSliderImageView, new Callback() {
@Override
public void onSuccess() {
holder.mBackgroundImage.setVisibility(View.GONE);
holder.tvWarningFailedtoLoad.setVisibility(View.GONE);
holder.tvTitle.setVisibility(View.VISIBLE);
holder.mSliderImageView.setClickable(true);
}
@Override
public void onError() {
holder.mBackgroundImage.setVisibility(View.GONE);
holder.tvWarningFailedtoLoad.setVisibility(View.VISIBLE);
holder.tvTitle.setVisibility(View.GONE);
holder.mSliderImageView.setClickable(false);
}
});
}
holder.mSliderImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClick.onItemCli(position, banners.get(position));
}
});
}
@Override
public int getItemCount() {
return banners.size(); }
public void setOnClick(OnItemClicked onClick) {
this.onClick = onClick;
}
public interface OnItemClicked {
void onItemCli(int position, Banner passData);
}
public class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mSliderImageView,mBackgroundImage;
public TextView tvWarningFailedtoLoad;
public TextView tvTitle;
View mView;
public ViewHolder(View itemView) {
super(itemView);
mView = itemView;
mSliderImageView = mView.findViewById(R.id.mSliderImage);
mBackgroundImage = mView.findViewById(R.id.backgroundImage);
tvWarningFailedtoLoad = mView.findViewById(R.id.tvFailedtoLoad);
tvTitle = mView.findViewById(R.id.mSliderImagetitle);
tvTitle.setSelected(true);
tvTitle.setSingleLine(true);
}
}
}
以下方法出错。
holder.mSliderImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClick.onItemCli(position, banners.get(position));
}
});
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
答案 0 :(得分:0)
我认为您问题的线索在documentation的以下部分:
请注意,与
ListView
不同的是,RecyclerView
将不会在数据集中更改项目的位置时再次调用此方法,除非该项目本身无效或无法确定新位置。因此,在获取此方法内的相关数据项时,仅应使用position
参数,而不应保留其副本。 如果以后需要某个物品的位置(例如,在单击侦听器中),请使用getAdapterPosition()
,它将具有更新的适配器位置。如果Adapter可以处理有效的部分绑定,请改写onBindViewHolder(ViewHolder, int, List)
。
因此,请更改您的setOnClickListener()
方法的实现,以使其不使用参数position
,而是调用getAdapterPosition()
来获取您的头寸的新值。