Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何禁用viewpager中的预加载?_Android_Android Viewpager - Fatal编程技术网

Android 如何禁用viewpager中的预加载?

Android 如何禁用viewpager中的预加载?,android,android-viewpager,Android,Android Viewpager,如何禁用viewpager中的预加载 我有一个有3页的可视寻呼机。所以我不想加载下一页和上一页。如何禁用该行为 如何禁用ViewPager中的预加载 这是不可能的。ViewPager总是至少预加载1页。如果不希望出现这种行为,则不应使用ViewPager。例如,您可以使用RecyclerView 旧答案 你必须打电话 从医生那里 设置应保留到页面两侧的页数 视图层次结构中处于空闲状态的当前页面。除此之外的页面 需要时,将从适配器重新创建限制 我修改了ViewPager源代码 private st

如何禁用viewpager中的预加载

我有一个有3页的可视寻呼机。所以我不想加载下一页和上一页。如何禁用该行为

如何禁用ViewPager中的预加载

这是不可能的。ViewPager总是至少预加载1页。如果不希望出现这种行为,则不应使用ViewPager。例如,您可以使用
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=限制;
填充();
}
}

嗯,这似乎比人们想象的要复杂一些。 下面的代码是一个抽象类,应该由片段实现。 事实上,它要求:

  • 将onActivityCreated替换为lazyOnActivityCreated
  • 实现lazyLoadData方法,为选项卡加载数据
  • 加载数据或出于任何原因更改活动数据调用setTabDataId后
  • 我知道这听起来有点复杂,但它每次都能工作,而且在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;
    }
    

    祝你好运

    谢谢大家!=D但OffscreenPageLimit(0)不起作用,因为参数的最小值为1。OffscreenPageLimit(0)在logcatI中抛出日志我希望这是因为1页是显示的实际页面。很遗憾,我需要这样做,因为android一直在错误的页面上更改GUI元素,而且我在ViewPager中使用片段,所以所有内容都必须是静态的,以避免内存不足。我希望Android能在某个时候扔掉整个GUI库,从头开始,现在一切都糟透了。我现在有一个800行的片段,可以显示15个动态元素。提供的解决方案并没有回答这个问题。最初的问题是如何在ViewPager中禁用预加载(即不加载下一页或上一页)。提供的解决方案在指定默认值1时不执行任何操作。更改什么的源代码?API本身?当安装到具有原始未接触API的设备上时,它将如何工作?@ichalos通常使用这种方法,您基本上创建了ModifiedViewPager,您可以进一步使用它而不是ViewPager,而且它工作得很好。但建议的修改不起作用。问得好!我还想知道是否可以先加载一个页面,然后缓存其他加载的页面。这种方法提供了NPE,因为有时它会在
    onCreateView
    之前被调用。你能处理吗?我不得不完全替换答案,因为它不能正常工作。它现在可以正常工作了。我知道它需要一些抛光,但现在可能会帮助你!