安卓系统:IndexOutOfBoundsException崩溃:长度=36;索引=-1



我有一个CardViews的RecyclerView列表。单击CardView,使用其在RecyclerView列表中的位置加载该CardView的DetailsActivity。最近,点击CardView会导致应用程序崩溃,出现ArrayIndexOutOfBoundsException。在返回到Recycler列表UI后,我确实很快点击了CardView,所以这可能是某种类型的异步错误。有没有关于如何修复的想法?

点击RecyclerView卡片中的物品代码适配器:

public List<Card> mListItems;
...
public Card getItem(int position) {   
**return mListItems.get(position);  // line 102**
}

单击CardsAdapter中的侦听器代码以处理项目单击:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = layoutInflater.inflate(R.layout.item_todo, parent,false);
final ItemHolder itemHolder = new ItemHolder(itemView);   
itemHolder.cardView.setOnClickListener(view -> {
**Card adapterItem = CardsAdapter.this.getItem(itemHolder.getBindingAdapterPosition()); // line 639**
int adapPos = itemHolder.getBindingAdapterPosition();
if (adapPos == RecyclerView.NO_POSITION || recyclerItemClickListener == null) {
return;
}
recyclerItemClickListener.onItemClick(itemHolder.cardView, adapterItem, adapPos);
});
...
}

Logcat:

E/AndroidRuntime:致命异常:main流程:com.todo.quickcards,PID:10677java.lang.ArrayIndexOutOfBoundsException:长度=36;java.util.ArrayList.get上的index=-1(ArrayList.java:439(在com.todo.quickcards.adapter.CardsAdapter.getItem(CardsAdaper.java:102(com.todo.squickcards.cadapter.cardsAdapterlambda$onCreateViewHolder$0$com到快速卡适配器CardsAdapter在android.view.view.performClick(view.java:6897(在android.view.view$PerformClick.run(view.java:26101(在android.os.Handler.handleCallback上(Handler.java:789(在android.os.Handler.dispatchMessage上(Handler.java:98(在android.os.Looper.loop(Looper.java:164(在android.app.ActivityThread.main上(ActivityThreads.java:6944(位于java.lang.reflect.Method.ioke(本机方法(网址:com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327(网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:1374(

如果要调用getItem(itemHolder.getBindingAdapterPosition()),最好在条件检查之后/内部调用它。它检查了无效的位置。

int adapPosition = itemHolder.getBindingAdapterPosition();
if (adapPos == RecyclerView.NO_POSITION || recyclerItemClickListener == null) {
return;
}
Card adapterItem = CardsAdapter.this.getItem(adapPosition);
recyclerItemClickListener.onItemClick(itemHolder.cardView, adapterItem, adapPos);