showing - viewpager android example
¿Cómo puedo desactivar la precarga en un viewpager? (3)
¿Cómo puedo deshabilitar la precarga en un ViewPager?
no es posible. ViewPager precarga siempre al menos 1 página. Si no desea este comportamiento, no debe usar ViewPager. Podrías usar, por ejemplo, un RecyclerView
Vieja respuesta
tienes que llamar a setOffscreenPageLimit(1)
Desde el doc
Establezca el número de páginas que deben conservarse en cualquier lado de la página actual en la jerarquía de vistas en estado inactivo. Las páginas más allá de este límite se recrearán desde el adaptador cuando sea necesario.
¿Cómo puedo desactivar la precarga en un viewpager?
Tengo un viewpager con 3 páginas. Así que no quiero cargar la página siguiente y la página anterior. ¿Cómo puedo deshabilitar ese comportamiento?
Bueno, parece que es un poco más complicado de lo que uno podría pensar. El código a continuación es una clase abstracta que debe ser implementada por su fragmento. De hecho requiere lo siguiente:
- Reemplace onActivityCreated con lazyOnActivityCreated .
- Implemente el método lazyLoadData que carga los datos para la pestaña.
- Después de haber cargado los datos o por cualquier motivo, ha cambiado la llamada de datos activa setTabDataId .
Sé que suena un poco complicado, pero funciona cada vez y definitivamente funcionará cuando setUserHint no sea bueno.
Aquí está la clase abstracta:
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;
}
¡Buena suerte!
Modifico el código fuente de ViewPager
private static final int DEFAULT_OFFSCREEN_PAGES = 0;
Puede encontrar la fuente en ViewPager sobre 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();
}
}