Как выполнить отложенную загрузку при использовании ViewPager2?

Я изменяю свой код на androidX, я использовал для хранения фрагментов в viewpager, и каждый фрагмент содержит несколько списков, теперь у меня проблемы с отложенной загрузкой при использовании viewpager2, есть ли какой-нибудь пример кода от Google?

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 (), где он возвращает истину или ложь в зависимости от того, хотите ли вы, чтобы этот фрагмент загружался немедленно или лениво
  3. переопределите initData() и поместите в него свою логику
Другие вопросы по тегам