android - studio - Posición de inicio de PagerAdapter
tabbed activity android studio (8)
Estoy usando 3 fragmentos y al iniciar mi aplicación, el segundo fragmento (del medio ) se mostrará de forma predeterminada. Solo estoy usando la función onResume y todo funciona muy bien.
@Override
protected void onResume() {
super.onResume();
m_viewPager.setCurrentItem(1);
}
Estoy usando el siguiente ejemplo para implementar mi viewPager: http://code.google.com/p/viewpagerexample/issues/list
El problema con este ejemplo es que no puedo encontrar la manera de establecer mi posición inicial, la posición inicial predeterminada es 0. Básicamente, no puedo controlar si hay una vista disponible a la izquierda o a la derecha.
¿Hay alguna manera de controlar la posición actual de la vista del centro? ¿Hay una mejor manera de hacerlo? ¿es posible hacerlo circular?
He encontrado una forma de establecer su posición, que se realiza fuera de la clase:
awesomePager = (ViewPager) findViewById(R.id.awesomepager);
awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);
y puede limitarse calculando la cantidad de elementos que quiero que quepan
He notado que si recrea la actividad (cambio de orientación) con ViewPager que tiene FragmentStatePagerAdapter, entonces el adaptador reutilizará sus Fragmentos. La forma de detenerlo es:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
if (viewPager != null) {
// before screen rotation it''s better to detach pagerAdapter from the ViewPager, so
// pagerAdapter can remove all old fragments, so they''re not reused after rotation.
viewPager.setAdapter(null);
}
super.onSaveInstanceState(savedInstanceState);
}
pero luego, después de Activity activity, ViewPager siempre abre la página 0 primero y estableceCurrentItem (CurrentPosition); no funciona La solución para eso es cambiar la página después de la demora:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(newPosition);
}
}, 100);
Me encontré con el mismo problema. Cuando inicié ViewPager, la posición del indicador era 0. Esto puede depender de la cantidad de cálculo para el contenido del busca. Yo uso ViewTreeObserver como a continuación.
mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mViewPager.setCurrentItem(newPosition);
removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
}
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);
y,
private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
if (observer == null) return;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
observer.removeGlobalOnLayoutListener(listener);
} else {
observer.removeOnGlobalLayoutListener(listener);
}
}
De esta manera, también nunca se molestará con el ajuste del tiempo de demora.
Me encontré con un problema por el cual si establezco el elemento actual antes de configurar el adaptador, el primer elemento que reciba siempre será el que está en la posición 0.
Asegúrate de hacerlo:
awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);
y no:
awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);
Para comenzar con el último fragmento, hice esto:
PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);
Tengo una matriz de tamaño de más de 1000 y en el visor dinámico me enfrentaba a Leftswipe atascado en Firstload. El siguiente código resolvió esto y dio como resultado un desplazamiento suave:
@Override
onResume(){
super.onResume();
viewPager.setCurrentItem(newPosition);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View currentPage = null;
switch(position){
case 0:
currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)
break;
case 1:
currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)
///////////// This page will be default ////////////////////
((ViewPager)container).setCurrentItem(position);
////////////////////////////////////////////////////////////
break;
case 2:
currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)
break;
return currentPage;
}