وجود باگی در RecyclerView

پرسیده شده
فعالیت 1256 روز پیش
دیده شده 799 بار
1

سلام دوستان

 یه چیزی که برام خیلی عجیب بود این بود که شما موقعی که 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);
    }
}

 

منبع جواب

فایل پیوست

1
حذف شده

سلام ابوالفضل جان 

بسیار عالی از مطلب خوبت

آیا این مشکل فقط زمانی وجود داشت که از خود لایبرری ریسایکلر استفاده میکردیم؟

یا در ورژن های قبلی هم چنین مشکلی وجود داشت ؟

و اینکه با اضافه کردن متریال دیزاین عملا نیازی به اضافه کردن خود لایبرری ریسایکلر نداریم آیا بازم با این وجود چنین مشکلی رو مشاهده کردید؟

(البته که در اندروید استودیو جدید اصلا نیازی به اضافه کردن لایبرری خاصی برای ریسایکلر و متریال نداریم چون پیشفرض اضافه شدن)

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

1 آبان 99

حذف شده
اینطور که زمان سوالات رو دیدم معلومه که حدودا توی چند نسخه اخیر بوده این باگ و یه خورده عجیب هست که فیکس نشده، نمیدونم دقیقا چرا.. فکر نکنم تفاوتی داشته باشه توی متریال دیزاین یا خود لایبراری... تستی انجام میدم ولی احتمالش فرقشون به نظرم صفر باشه.. و اینکه چه عالی که توی نسخه جدید نیاز به اضافه کردن نیست(نمیدونستم خودم)
1
حذف شده

سلام 

من کاری که گفته بودید رو انجام دادم بعضی وقتها درست کار میکنه بعضی وقتها نه،واسه شما هم همین جوری هست؟

راه حل دیگه نداره؟

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

توسط

Ayoob Kargar

19 آبان 99

حذف شده
سلام ایوب جان.. لطفا برای ارسال کدهاتون توی بخش سوال از فرمت PHP استفاده کنید تا نظم کدها به هم نخوره و خواناییش پایین نیاد.. دوباره بفرستید تا جوابتون رو بدم..
0
حذف شده
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

توسط

Ayoob Kargar

21 آبان 99

حذف شده
باگی که وجود داره باعث میشه اصن توی گرید لیوت شما به مشکل بخورید.. یه متدی بود یادمه ازخود کلاس گرید لیوت اوررایدش کردم و باعث میشد یه عملیاتی رو کنسل کنه تا کرش نکنه نرم افزار.. اونجا این مشکل پیش میومد که ایندکس اول رو دوباره ازش میساخت و ایندکس آخر رو حذف میکرد.. این باگ فعلا حل نشده و شاید بهتر باشه تا اون زمان از گرید لیوت استفاده نکنین..