【问题标题】:How to do lazy loading when using ViewPager2?使用 ViewPager2 时如何进行延迟加载?
【发布时间】:2019-04-17 11:20:02
【问题描述】:

我正在将我的代码更改为androidX,我曾经在viewpager中存储片段并且每个片段包含几个列表,现在我在使用viewpager2时遇到了延迟加载的问题,是否有一些来自google的示例代码?

【问题讨论】:

    标签: androidx android-viewpager2


    【解决方案1】:

    试试这个

    abstract class LazyFragment : Fragment() {
    
        private var isInitData : Boolean = false            // flag bit to determine whether the data is initialized
        private var isVisibleToUser : Boolean = false       // flags to determine whether fragments are visible
        private var isPrepareView : Boolean = false         // flag bit to determine that view has been loaded to avoid null pointer operations
    
        override fun onViewCreated(@NonNull view: View, @Nullable savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            isPrepareView = true // At this point the view has been loaded and set to true
        }
    
    
        override fun onHiddenChanged(hidden: Boolean) {
            super.onHiddenChanged(hidden)
            if (!hidden) {
                lazyInitData()
            }
        }
    
    
        override fun onResume() {
            super.onResume()
            isVisibleToUser = true
            lazyInitData() // Load lazily
        }
    
        override fun onPause() {
            super.onPause()
            isVisibleToUser = false
        }
    
        override fun onAttach(context: Context) {
            super.onAttach(context)
            lazyInitData() // Load lazily
        }
    
        //
    
    
        /**
         * Lazy Loading Method
         */
        private fun lazyInitData(){
            if(setFragmentTarget()){
                if(!isInitData && isVisibleToUser && isPrepareView) {
                    loadData()
                }
            }else {
                if(!isInitData && isVisibleToUser && isPrepareView) {
                    loadData()
                }else if (!isInitData && parentFragment ==null && isPrepareView ){
                    loadData()
                }
            }
        }
    
        private fun loadData() {
            initData(); // Load data
            isInitData = true; // Has the data flag been loaded and reassigned to true
        }
    
    
        /**
         * Method of loading data, implemented by subclasses
         */
        abstract fun initData()
    
        /**
         * Setting Fragment target, implemented by subclasses
         */
        abstract fun setFragmentTarget(): Boolean
    

    你需要做的是这个

    (对于您在 ViewPager2 中使用的每个片段,使片段扩展 LazyFragment):

    1. 覆盖 onCreateView() 以扩展布局
    2. 覆盖 setFragmentTarget (),根据您是希望该片段立即加载还是延迟加载,它返回 true 或 false
    3. 覆盖 initData() 并将您的逻辑放入其中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2011-01-09
      • 2017-07-08
      相关资源
      最近更新 更多