RecyclerView index=-1 快速滚动到底部时
RecyclerView index=-1 when scrolling fast to the bottom
我创建了一个 RecyclerView
来显示项目,除了一种情况外,一切都正常显示和工作:当我快速滚动到 RecyclerView
的底部时。
如果这样做,我会收到以下错误:
java.lang.ArrayIndexOutOfBoundsException: length=15; index=-1
它将我引导到我的这部分代码(特别是 checkIfBorrowed.get( getAdapterPosition() )
):
public class itemtestAdapter extends RecyclerView.Adapter<itemtestAdapter.testViewHolder> {
private List<Discoveritems> items;
private List<Boolean> checkIftested;
interface OnItemCheckListener {
void onItemCheck(Discoveritems items);
void onItemUncheck(Discoveritems items);
}
@NonNull
private OnItemCheckListener onItemCheckListener;
public itemtestAdapter(List<Discoveritems> items, List<Boolean> checkIftested, @NonNull OnItemCheckListener onItemCheckListener) {
this.items = items;
this.onItemCheckListener = onItemCheckListener;
this.checkIftested = checkIftested;
}
@Override
public testViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
view = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_item_test_list, parent, false );
return new testViewHolder(view);
}
@Override
public void onBindViewHolder(testViewHolder holder, int position) {
holder.bind(items.get(position));
final Discoveritems currentItem = items.get(position);
holder.setOnClickListener( v -> {
holder.Cb_test.setChecked(
!holder.Cb_test.isChecked());
if (holder.Cb_test.isChecked()) {
onItemCheckListener.onItemCheck(currentItem);
} else {
onItemCheckListener.onItemUncheck(currentItem);
}
} );
}
@Override
public int getItemCount() {
return items.size();
}
class testViewHolder extends RecyclerView.ViewHolder {
ImageView Iv_test,itemPic;
TextView itemName;
CheckBox Cb_test;
Discoveritems items;
public testViewHolder(View itemView) {
super(itemView);
Iv_testitemPic = itemView.findViewById(R.id.iv_itemCover);
Tv_testitemName = itemView.findViewById( R.id.tv_testeditemName);
Cb_test = itemView.findViewById( R.id.cb_testitem );
Cb_test.setClickable( false );
}
public void setOnClickListener(View.OnClickListener onClickListener) {
itemView.setOnClickListener(onClickListener);
}
public void bind(Discoveritems items) {
this.items = items;
String itemID = items.getitemID();
MyitemClient client = new MyitemClient();
client.getitems(itemID, new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response){
if(response!=null){
final Myitem items = Myitem.fromJson(response);
if (checkIftested.get( getAdapterPosition() )){
itemView.setEnabled(false);
Tv_itemName.setText("my" + items.getTitle());
} else {
Tv_itemName.setText( items.getTitle() );
}
}
}
});
}
}
}
问题是在绑定内部我无法弄清楚如何在不使用 getAdapterPosition
的情况下获取项目的位置而且我也无法理解为什么它只在我快速滚动时发生。
同样奇怪的是它说 length = 15 而 checkIfBorowed 的大小仅为 12。
谢谢
将 holder.bind(items.get(position));
更改为 holder.bind(items.get(position), position);
,然后更改视图持有者 bind
方法以接受新的位置参数,即 bind(Discoveritems items, int position)
并使用位置而不是 getAdapterPosition()
。
问题是您没有使用适配器为您的 viewholder 提供的位置,当视图被回收时,该位置可能会发生变化,因此它们无法正常工作。更多内容请看这里
我创建了一个 RecyclerView
来显示项目,除了一种情况外,一切都正常显示和工作:当我快速滚动到 RecyclerView
的底部时。
如果这样做,我会收到以下错误:
java.lang.ArrayIndexOutOfBoundsException: length=15; index=-1
它将我引导到我的这部分代码(特别是 checkIfBorrowed.get( getAdapterPosition() )
):
public class itemtestAdapter extends RecyclerView.Adapter<itemtestAdapter.testViewHolder> {
private List<Discoveritems> items;
private List<Boolean> checkIftested;
interface OnItemCheckListener {
void onItemCheck(Discoveritems items);
void onItemUncheck(Discoveritems items);
}
@NonNull
private OnItemCheckListener onItemCheckListener;
public itemtestAdapter(List<Discoveritems> items, List<Boolean> checkIftested, @NonNull OnItemCheckListener onItemCheckListener) {
this.items = items;
this.onItemCheckListener = onItemCheckListener;
this.checkIftested = checkIftested;
}
@Override
public testViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
view = LayoutInflater.from(parent.getContext()).inflate( R.layout.item_item_test_list, parent, false );
return new testViewHolder(view);
}
@Override
public void onBindViewHolder(testViewHolder holder, int position) {
holder.bind(items.get(position));
final Discoveritems currentItem = items.get(position);
holder.setOnClickListener( v -> {
holder.Cb_test.setChecked(
!holder.Cb_test.isChecked());
if (holder.Cb_test.isChecked()) {
onItemCheckListener.onItemCheck(currentItem);
} else {
onItemCheckListener.onItemUncheck(currentItem);
}
} );
}
@Override
public int getItemCount() {
return items.size();
}
class testViewHolder extends RecyclerView.ViewHolder {
ImageView Iv_test,itemPic;
TextView itemName;
CheckBox Cb_test;
Discoveritems items;
public testViewHolder(View itemView) {
super(itemView);
Iv_testitemPic = itemView.findViewById(R.id.iv_itemCover);
Tv_testitemName = itemView.findViewById( R.id.tv_testeditemName);
Cb_test = itemView.findViewById( R.id.cb_testitem );
Cb_test.setClickable( false );
}
public void setOnClickListener(View.OnClickListener onClickListener) {
itemView.setOnClickListener(onClickListener);
}
public void bind(Discoveritems items) {
this.items = items;
String itemID = items.getitemID();
MyitemClient client = new MyitemClient();
client.getitems(itemID, new JsonHttpResponseHandler(){
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response){
if(response!=null){
final Myitem items = Myitem.fromJson(response);
if (checkIftested.get( getAdapterPosition() )){
itemView.setEnabled(false);
Tv_itemName.setText("my" + items.getTitle());
} else {
Tv_itemName.setText( items.getTitle() );
}
}
}
});
}
}
}
问题是在绑定内部我无法弄清楚如何在不使用 getAdapterPosition
的情况下获取项目的位置而且我也无法理解为什么它只在我快速滚动时发生。
同样奇怪的是它说 length = 15 而 checkIfBorowed 的大小仅为 12。 谢谢
将 holder.bind(items.get(position));
更改为 holder.bind(items.get(position), position);
,然后更改视图持有者 bind
方法以接受新的位置参数,即 bind(Discoveritems items, int position)
并使用位置而不是 getAdapterPosition()
。
问题是您没有使用适配器为您的 viewholder 提供的位置,当视图被回收时,该位置可能会发生变化,因此它们无法正常工作。更多内容请看这里