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