gpt4 book ai didi

java - 数组删除首先从较低的索引开始?

转载 作者:行者123 更新时间:2023-11-30 05:02:28 25 4
gpt4 key购买 nike

我的应用程序在前台。回收站 View 列表中有 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; index=-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

最佳答案

我猜你的问题的线索在 documentation 的以下部分:

Note that unlike ListView, RecyclerView will not call this method again if the position of the item changes in the data set unless the item itself is invalidated or the new position cannot be determined. For this reason, you should only use the position parameter while acquiring the related data item inside this method and should not keep a copy of it. If you need the position of an item later on (e.g. in a click listener), use getAdapterPosition() which will have the updated adapter position. Override onBindViewHolder(ViewHolder, int, List) instead if Adapter can handle efficient partial bind.

因此请更改setOnClickListener() 方法的实现,使其不使用参数position,而是调用getAdapterPosition() 来代替获得职位的新值(value)。

关于java - 数组删除首先从较低的索引开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58006058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com