本篇帖子用于記錄在開發(fā)過程中有關(guān)recyclerView的錯誤總結(jié)第股,會慢慢更新...
1.非法狀態(tài)異常
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{a767943 VFED..... .F....ID 0,0-1080,1594 #7f07006c app:id/recyclerShopcart}, adapter:com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter@a363bc0, layout:android.support.v7.widget.LinearLayoutManager@5cc20f9, context:com.bawie.bawaymall160a.shopcart.activity.ShopcartActivity@6408c0
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5281)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11997)
at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:7070)
at com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter$MyViewHodler$1.onCheckedChanged(ShopcartRecyclerAdapter.java:134)
at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
at com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter.onBindViewHolder(ShopcartRecyclerAdapter.java:63)
at com.bawie.bawaymall160a.shopcart.adapter.ShopcartRecyclerAdapter.onBindViewHolder(ShopcartRecyclerAdapter.java:24)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
關(guān)鍵詞:Cannot call this method while RecyclerView is computing a layout or scrolling
大概意思是說無法調(diào)用這個方法當(dāng)recyclerView正在計(jì)算布局或者滾動的時候浪蹂。
這個異常通常是在我們在動態(tài)更新recyclerView的布局的時候出現(xiàn)萎庭,常常伴隨這樣的代碼
class MyViewHodler extends RecyclerView.ViewHolder {
TextView tvShopName;
RecyclerView recyclerGoods;
CheckBox checkBox;
public MyViewHodler(@NonNull View itemView) {
super(itemView);
tvShopName = itemView.findViewById(R.id.tvShopName);
recyclerGoods = itemView.findViewById(R.id.recyclerGoods);
checkBox = itemView.findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//各種處理數(shù)據(jù)的代碼
//處理完數(shù)據(jù)去更新recyclerView臂聋,此時會報(bào)上述異常
notifyDataSetChanged();
}
});
}
}
解決方案:
class MyViewHodler extends RecyclerView.ViewHolder {
TextView tvShopName;
RecyclerView recyclerGoods;
CheckBox checkBox;
public MyViewHodler(@NonNull View itemView) {
super(itemView);
tvShopName = itemView.findViewById(R.id.tvShopName);
recyclerGoods = itemView.findViewById(R.id.recyclerGoods);
checkBox = itemView.findViewById(R.id.checkbox);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//各種處理數(shù)據(jù)的代碼
//更新數(shù)據(jù)的時候使用handler
new Handler().post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
});
}
}
2.非法狀態(tài)異常
FATAL EXCEPTION: main
java.lang.IllegalArgumentException: view is not a child, cannot hideandroid.widget.LinearLayout{ef2ld2d V.E............I.0,1926-1080,2076}
FATAL EXCEPTION: main
Process:com.wuba光稼,PID:3847
java,lang.IllegalArgumentException: view is not a child, cannot hideandroid.widget.LinearLayout{ef21d2d V.E...........I.8,1926-1080,2076}at androidx.recyclerview.widget.ChildHelper.unhide(ChildHelper.java:352)
at
androidx. recyclerview.widget.RecyclerView$Recycler.getscrapOrHiddenOrCachedHolderForPosition(RecyclerView.java:6857)
at
androidx. recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6337)
at
androidx. recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)
at androidx. recyclerview.widget.GapWorker.flushTaskwithDeadline(GapWorker.java:345)at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)
at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:259)
at android.app.ActivityThread.main(ActivityThread.java:8208)
at java.lang.reflect.Method.invoke(Native Method)at com.android,internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.iava:592)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)
關(guān)鍵詞:view is not a child, cannot hide android.widget.LinearLayout
出現(xiàn)異常的代碼是這樣調(diào)用的
public void addItemsData(List<ListItemDataBean> list) {
if (list == null || list.size() == 0) return;
addItems(list);
notifyItemRangeChanged(getItems().size() - 1,list.size());
}
修改后
public void addItemsData(List<ListItemDataBean> list) {
if (list == null || list.size() == 0) return;
addItems(list);
if (list.size() > 1) {
notifyItemRangeChanged(getItems().size() - 1, list.size());
} else {
notifyDataSetChanged();
}
}