如何在viewpager中禁用预加载?

时间:2014-05-30 16:23:13

标签: android android-viewpager

如何在viewpager中禁用预加载?。

我有一个3页的viewpager。所以我不想加载下一页和以前的页面。我该如何禁用这种行为?

3 个答案:

答案 0 :(得分:11)

  

如何在ViewPager中禁用预加载?。

这是不可能的。 ViewPager预装总是至少1页。如果您不想要这种行为,则不应使用ViewPager。例如,您可以使用RecyclerView

旧答案

你必须致电setOffscreenPageLimit(1)

来自文档

  

设置应保留在页面两侧的页数   处于空闲状态的视图层次结构中的当前页面。页面超出此范围   在需要时,将从适配器重新创建限制。

答案 1 :(得分:7)

嗯,看起来它比人们想象的要复杂一点。 下面的代码是一个抽象类,应该由您的片段实现。 实际上它需要以下内容:

  1. 使用 lazyOnActivityCreated 替换 onActivityCreated
  2. 实现加载选项卡数据的 lazyLoadData 方法。
  3. 加载数据后或出于任何原因更改了活动数据调用 setTabDataId
  4. 我知道这听起来有点复杂,但它每次都有效,当 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();
    }
}