سلام دوستان
یه چیزی که برام خیلی عجیب بود این بود که شما موقعی که GridLayoutManager رو ست کردید متوجه اروری که موقع اضافه کردن یا دیلیت کردن آیتمی که توی ریسایکلر ویوتون هست نشدید!
من خیلی تحقیق کردم و متوجه شدم که باگی در ریسایکلر ویو وجود داره که باعث وجود اشکالاتی در index میشه و موقعی که شما چیزی رو دیلیت یا اد میکنین اپ کرش میکنه..
این باگ توی نسخه ی recyclerView:30.0.0 وجود داره و راه حلش به این شکل هست که:
۱- شما باید یه کلاسی ایجاد کنین و LayoutManager مربوطه رو extends کنین
۲- Constructor های LayoutManager رو طبق کد زیر قرار بدید داخل این کلاس
۳- متد onLayoutChildren رو اورراید کنید و مانند کد زیر اون رو داخل try catch قرار بدید تا حداقل مشکل کرش نرم افزار فعلا حل بشه..
پ.ن: گویا این باگ فقط در GridLayoutManager وجود داره و همونطور که پروژه رو ما انجام دادیم مشکلی در LinearLayoutManager وجود نداشت..
public class NpaGridLayoutManager extends GridLayoutManager {
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
try{
super.onLayoutChildren(recycler, state);
}catch(IndexOutOfBoundsException e){
Log.e("LayoutManagerError", "onLayoutChildren: "+e);
}
}
public NpaGridLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public NpaGridLayoutManager(Context context, int spanCount) {
super(context, spanCount);
}
public NpaGridLayoutManager(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
}
}
سلام ابوالفضل جان
بسیار عالی از مطلب خوبت
آیا این مشکل فقط زمانی وجود داشت که از خود لایبرری ریسایکلر استفاده میکردیم؟
یا در ورژن های قبلی هم چنین مشکلی وجود داشت ؟
و اینکه با اضافه کردن متریال دیزاین عملا نیازی به اضافه کردن خود لایبرری ریسایکلر نداریم آیا بازم با این وجود چنین مشکلی رو مشاهده کردید؟
(البته که در اندروید استودیو جدید اصلا نیازی به اضافه کردن لایبرری خاصی برای ریسایکلر و متریال نداریم چون پیشفرض اضافه شدن)
سلام
من کاری که گفته بودید رو انجام دادم بعضی وقتها درست کار میکنه بعضی وقتها نه،واسه شما هم همین جوری هست؟
راه حل دیگه نداره؟
private GridLayout gridLayout;
gridLayout=new GridLayout(getContext(),1,RecyclerView.VERTICAL,false);
recyclerView.setLayoutManager(gridLayout);
public void setViewTye(ViewType viewTye){ if(fileAdapter!=null) { fileAdapter.setViewType(viewTye); if(viewTye==ViewType.Row){ gridLayout.setSpanCount(1); }else if(viewTye==ViewType.Grid){ gridLayout.setSpanCount(2); } } }
private GridLayout gridLayout;
gridLayout=new GridLayout(getContext(),1,RecyclerView.VERTICAL,false);
recyclerView.setLayoutManager(gridLayout);
public void setViewTye(ViewType viewTye){
if(fileAdapter!=null)
{
fileAdapter.setViewType(viewTye);
if(viewTye==ViewType.Row){
gridLayout.setSpanCount(1);
}else if(viewTye==ViewType.Grid){
gridLayout.setSpanCount(2);
}
}
}
سلام دوست عزیز
من به روش بالا از کد شما استفاده کردم ،ولی گاهی کار میکنه گاهی نه
public class GridLayout extends GridLayoutManager {
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
try {
super.onLayoutChildren(recycler, state);
}catch (IndexOutOfBoundsException e){
Log.e("LayoutManagerError", "onLayoutChildren:"+e );
}
}
public GridLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public GridLayout(Context context, int spanCount) {
super(context, spanCount);
}
public GridLayout(Context context, int spanCount, int orientation, boolean reverseLayout) {
super(context, spanCount, orientation, reverseLayout);
}
}