Android 如何禁用viewpager中的预加载?
如何禁用viewpager中的预加载 我有一个有3页的可视寻呼机。所以我不想加载下一页和上一页。如何禁用该行为 如何禁用ViewPager中的预加载 这是不可能的。ViewPager总是至少预加载1页。如果不希望出现这种行为,则不应使用ViewPager。例如,您可以使用Android 如何禁用viewpager中的预加载?,android,android-viewpager,Android,Android Viewpager,如何禁用viewpager中的预加载 我有一个有3页的可视寻呼机。所以我不想加载下一页和上一页。如何禁用该行为 如何禁用ViewPager中的预加载 这是不可能的。ViewPager总是至少预加载1页。如果不希望出现这种行为,则不应使用ViewPager。例如,您可以使用RecyclerView 旧答案 你必须打电话 从医生那里 设置应保留到页面两侧的页数 视图层次结构中处于空闲状态的当前页面。除此之外的页面 需要时,将从适配器重新创建限制 我修改了ViewPager源代码 private st
RecyclerView
旧答案
你必须打电话
从医生那里
设置应保留到页面两侧的页数
视图层次结构中处于空闲状态的当前页面。除此之外的页面
需要时,将从适配器重新创建限制
我修改了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();
}
}
public void setOffscreenPageLimit(整数限制){
如果(限制<默认\u屏幕外\u页面){
Log.w(标记,“请求的屏幕外页面限制”+限制+“太小;默认为”+
默认(屏幕外页面);
限制=默认的屏幕外页面;
}
if(限制!=mOffscreenPageLimit){
mOffscreenPageLimit=限制;
填充();
}
}
嗯,这似乎比人们想象的要复杂一些。
下面的代码是一个抽象类,应该由片段实现。
事实上,它要求:
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;
}
祝你好运 谢谢大家!=D但OffscreenPageLimit(0)不起作用,因为参数的最小值为1。OffscreenPageLimit(0)在logcatI中抛出日志我希望这是因为1页是显示的实际页面。很遗憾,我需要这样做,因为android一直在错误的页面上更改GUI元素,而且我在ViewPager中使用片段,所以所有内容都必须是静态的,以避免内存不足。我希望Android能在某个时候扔掉整个GUI库,从头开始,现在一切都糟透了。我现在有一个800行的片段,可以显示15个动态元素。提供的解决方案并没有回答这个问题。最初的问题是如何在ViewPager中禁用预加载(即不加载下一页或上一页)。提供的解决方案在指定默认值1时不执行任何操作。更改什么的源代码?API本身?当安装到具有原始未接触API的设备上时,它将如何工作?@ichalos通常使用这种方法,您基本上创建了ModifiedViewPager,您可以进一步使用它而不是ViewPager,而且它工作得很好。但建议的修改不起作用。问得好!我还想知道是否可以先加载一个页面,然后缓存其他加载的页面。这种方法提供了NPE,因为有时它会在
onCreateView
之前被调用。你能处理吗?我不得不完全替换答案,因为它不能正常工作。它现在可以正常工作了。我知道它需要一些抛光,但现在可能会帮助你!