viewpager practice pageradapter example best java android nullpointerexception android-fragments android-viewpager

java - practice - viewpager slider in android



¿Los fragmentos de ViewPager se destruyen con el tiempo? (2)

Agregue lo siguiente cuando ViewPager su ViewPager ,

mPager.setOffscreenPageLimit(NUM_ITEMS-1);

En su caso, esto establecerá el número de páginas fuera de pantalla en 1 (es decir, mantendrá la página adicional fuera de pantalla en la memoria cuando la otra página esté actualmente enfocada). Esto obligará a su ViewPager a mantener todos los Fragment incluso cuando no estén enfocados.

Estoy usando el paquete support.v4 de Android para desarrollar un ViewPager que contenga múltiples Fragment .

Estoy tratando de ocultar las Vistas cuando el usuario cambia de página. Entonces, implementé un OnPageChangeListener para escuchar mi adaptador y llamé a un método update() en mis Fragment cuando ocurre un cambio de página. Pero estoy recibiendo una NullPointerException , y no puedo entender por qué.

Aquí está el código:

public class MyActivity extends FragmentActivity implements OnPageChangeListener { private static final int NUM_ITEMS = 2; private ViewPager mPager; private static SpaceAdapter mAdapter; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_pager); mAdapter = new SpaceAdapter(getSupportFragmentManager()); mPager = (ViewPager) findViewById(R.id.pager); mPager.setAdapter(mAdapter); mPager.setOnPageChangeListener(this); } public static class SpaceAdapter extends FragmentPagerAdapter { public SpaceAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return NUM_ITEMS; } @Override public Fragment getItem(int position) { switch (position) { case 0: return new MyFragment(); case 1: return new MyFragment(); default: return new MyFragment(); } } } @Override public void onPageScrollStateChanged(int arg0) { Log.i("pagination", "scroll state changed: " + arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // Log.i("pagination", "page scroll: " + arg0 + " with: " + arg1 + ", " + arg2); if (mAdapter.getItem(arg0) instanceof IUpdateOnPage) { ((IUpdateOnPage) mAdapter.getItem(arg0)).updateOnPage(); } } @Override public void onPageSelected(int arg0) { Log.i("pagination", "page selected: " + arg0); } }

y

public class MyFragment extends Fragment implements SurfaceHolder.Callback, IUpdateOnPage { private SurfaceView charts; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.crew, null); bindViews(v); return v; } private void bindViews(View v) { charts = (SurfaceView) v.findViewById(R.id.civ_charts); charts.getHolder().addCallback(this); Log.i("wtf", "huh " + String.valueOf(charts == null)); // logs false } @Override public void updateOnPage() { if (charts != null) { Log.i("crew surface", "hidden"); charts.setVisibility(View.GONE); } else { Log.i("crew surface", "charts is null"); //THIS HERE gets logged } } }

wCuando copié / pegué, SurfaceHolder.Callback métodos SurfaceHolder.Callback , pero están ahí. El bindViews(v) registra si los charts == null , y eso siempre devuelve falso. Cuando la página, se llama a updateOnPage , y los charts == null devuelven verdadero. ¿Por qué sucede esto y cómo lo consigo?

Y esta es la línea 108:

charts.setVisibility(View.GONE);


Examiné tu código y creo que el problema es que en onPageScrolled , estás llamando a getItem . Esta implementación (que en realidad es como la mayoría de las implementaciones en la web) devuelve una nueva instancia cada vez. Sin embargo, la mayoría de los ejemplos que he visto no llaman getItem , por lo que generalmente esto está bien.

En su caso, mantendría la perezosa creación del Fragmento en getItem : si no existe para esa posición, luego getItem y luego colóquelo en una ArrayList o alguna otra colección, pero si ya existe, simplemente devuélvalo de esa colección.

De lo contrario, crea una instancia de fragmento A, luego se desplaza a otra instancia de fragmento B. Intenta decirle a la instancia de fragmento A que limpie algunas vistas, pero termina diciéndole a una nueva instancia de fragmento C que lo haga. Todavía no ha tenido la oportunidad de configurar sus propias vistas, por lo que está obteniendo el puntero nulo a los gráficos.