如何禁用viewpager中的预加载?

如何禁用viewpager中的预加载?

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

如何禁用ViewPager中的预加载?

这不可能。 ViewPager总是预载至less1页。 如果你不想要这个行为,你不应该使用ViewPager。 你可以使用,例如,一个RecyclerView

老答案

你必须调用setOffscreenPageLimit(1)

从文档

在空闲状态下,将视图层次结构中应保留在当前页面任一侧的页数。 超出此限制的页面将在需要时从适配器重新创build。

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

  1. onActivityCreatedreplace为lazyOnActivityCreated
  2. 实现加载标签数据的lazyLoadData方法。
  3. 在您加载数据或出于任何原因之后,您已更改了活动的数据调用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; } 

祝你好运!

我修改ViewPager源代码

 private static final int DEFAULT_OFFSCREEN_PAGES = 0; 

你可以在ViewPager中find关于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(); } }