【发布时间】:2019-04-17 11:20:02
【问题描述】:
我正在将我的代码更改为androidX,我曾经在viewpager中存储片段并且每个片段包含几个列表,现在我在使用viewpager2时遇到了延迟加载的问题,是否有一些来自google的示例代码?
【问题讨论】:
标签: androidx android-viewpager2
我正在将我的代码更改为androidX,我曾经在viewpager中存储片段并且每个片段包含几个列表,现在我在使用viewpager2时遇到了延迟加载的问题,是否有一些来自google的示例代码?
【问题讨论】:
标签: androidx android-viewpager2
试试这个
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):
【讨论】: