تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ ابوالفضل رضایی
وجود باگی در RecyclerView
جامعه جاوا (اندروید) ایجاد شده در ۰۱ آبان ۱۳۹۹

سلام دوستان

 یه چیزی که برام خیلی عجیب بود این بود که شما موقعی که 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);
        }
    }
}
Ayoob Kargar ۱۹ آبان ۱۳۹۹، ۰۷:۱۴
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);
    }
}

 

Ayoob Kargar ۲۱ آبان ۱۳۹۹، ۰۷:۵۰