يؤدي استبدال مهايئ ViewPager إلى تغيير الأجزاء التي تظهر خارج الشاشة فقط

-1

انا املك ViewPager يعرض 10 أجزاء. ولكن عندما أغير FragmentPagerAdapter وتعيينه إلى ViewPager يتم تغيير الأجزاء غير المعروضة حاليًا فقط. حاولت إبطال ViewPager ، داعيا notifyDataSetChanged() في ال FragmentPagerAdapter وهذه الإجابة SO وتغيير البيانات فقط بدلاً من المحول (وهذه الإجابة تستخدم أ PagerAdapter بدلا من FragmentPagerAdapter ولكن من دون نجاح.

هذه هي الطريقة التي أبدأ بها ViewPager

viewPager = rootView.findViewById(R.id.view_pager)
changeData()

ثم بعد ذلك لتغيير أدعو هذه الوظيفة

fun changeData(params: List<CustomObject> = ArrayList()){
    viewPager.adapter = CustomCPagerAdapter(fragmentManager!!, params)
}

و CustomPagerAdapter

class CustomPagerAdapter(fm: FragmentManager,
                         private var customDataSet: List<CustomObject>) 
    : FragmentPagerAdapter(fm) {  

    override fun getItem(pos: Int): Fragment {
        return CustomFragment.newInstance(customDataSet[pos])
    }

    override fun getCount(): Int {
        return customDataSet.size
    }
}

لماذا هو ViewPager حفظ الأجزاء المعروضة على الرغم من أنها جديدة FragmentPagerAdapter يضاف إليها؟ كيف يمكنني تغيير هذا؟

2 الاجابة

0

الحل هو الاستخدام FragmentStatePagerAdapter بدلا من FragmentPagerAdapter لأنه لا يحتفظ بالشظايا في الذاكرة. يحتوي المحول الأخير على نوع من التحسين ولا يفرض تحديث الأجزاء المعروضة بالفعل حتى عند وجود مثيل جديد لـ FragmentPagerAdapter تم تعيينه إلى ViewPager .

من المستندات حول FragmentStatePagerAdapter

This version of the pager is more useful when there are a large number of pages, working more like a list view. When pages are not visible to the user, their entire fragment may be destroyed, only keeping the saved state of that fragment. This allows the pager to hold on to much less memory associated with each visited page as compared to FragmentPagerAdapter at the cost of potentially more overhead when switching between pages.

:مؤلف
0

جرب هذا:-

fun changeData(params: List<CustomObject> = ArrayList()){
    viewPager.adapter = null 
    viewPager.adapter = CustomCPagerAdapter(fragmentManager!!, params)
}
:مؤلف
فوق
قائمة طعام