如何在viewpager中禁用预加载?。
我有一个3页的viewpager。所以我不想加载下一页和以前的页面。我该如何禁用这种行为?
答案 0 :(得分:11)
如何在ViewPager中禁用预加载?。
这是不可能的。 ViewPager预装总是至少1页。如果您不想要这种行为,则不应使用ViewPager。例如,您可以使用RecyclerView
旧答案
来自文档
设置应保留在页面两侧的页数 处于空闲状态的视图层次结构中的当前页面。页面超出此范围 在需要时,将从适配器重新创建限制。
答案 1 :(得分:7)
我知道这听起来有点复杂,但它每次都有效,当 setUserHint 不好时肯定会有效。
这是抽象类:
public abstract class LazyFetchTabFragment extends AbstractTabFragment {
private String tabDataId;
private String activeTabDataId;
private boolean isActive = false;
private boolean isCreated = false;
@Override
public void onStop(){
super.onStop();
isCreated = false;
activeTabDataId = null;
}
/**
* An abstract method that should be called instead of {@link android.app.Fragment#onActivityCreated(Bundle)}.
*/
public abstract void lazyOnActivityCreated() throws Exception;
public abstract void lazyLoadData() throws Exception;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
try {
lazyOnActivityCreated();
isCreated = true;
loadData();
} catch (Exception e) {
Log.e(this.getClass().getCanonicalName() + " - "
+ Thread.currentThread().getStackTrace()[2].getMethodName(), e.toString());
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// When changing tabs the spinner setOnItemSelectedListener is not called,
// so use code below to trigger loading data.
isActive = isVisibleToUser;
loadData();
}
private void loadData(boolean force) {
if (isActive && isCreated && tabDataId != null &&
(force || (activeTabDataId == null || !activeTabDataId.equals(tabDataId))))
try {
lazyLoadData();
activeTabDataId = tabDataId;
} catch (Exception ex){
Log.e(this.getClass().getCanonicalName() + " - "
+ Thread.currentThread().getStackTrace()[2].getMethodName(), ex.toString());
}
}
public void setTabDataId(String tabDataId) {
this.tabDataId = tabDataId;
}
祝你好运!
答案 2 :(得分:1)
我修改了ViewPager源代码
private static final int DEFAULT_OFFSCREEN_PAGES = 0;
您可以在ViewPager中找到关于setOffscreenPageLimit
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}