2012-06-12 11 views
5

Quiero implementar una lista de ViewPagers. Cada elemento de un ListView es ViewPager. Esto funciona hasta ahora. Mi problema es que no puedo mantener el estado de ViewPager. Por ejemplo: cuando cambio la página del primer ViewPager en la lista, me desplazo hacia abajo hasta que el primer ViewPager ya no esté visible y luego me muevo hacia arriba otra vez, el primer ViewPager muestra su primera página nuevamente.¿Cómo mantener el estado de ViewPager en un ListView?

Escribí dos adaptadores, uno para ListView y otro para ViewPager. Estoy tratando de reciclar la vista del parámetro convertView del método getView en el ListAdapter. No estoy seguro de si lo estoy haciendo bien y no tengo idea de cómo hacerlo en ViewPagerAdapter.

¿Alguna idea?

aquí es mi código hasta ahora:

getView de MyListAdapter:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    if(convertView == null){ 
     LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mRowView = inflater.inflate(R.layout.listitem, parent, false); 

    }else{ 
     mRowView=convertView; 
    } 
    switch(position){ 
    case 0://Fussball 
     ViewPagerAdapter fussballAdapter = new ViewPagerAdapter(mContext,"Fussball"); 
     ViewPager fussballPager = (ViewPager) mRowView.findViewById(R.id.viewpager1); 
     fussballPager.setAdapter(fussballAdapter); 
    break; 
    case 1://Handball 
    ViewPagerAdapter handballAdapter = new ViewPagerAdapter(mContext,"Handball"); 
     ViewPager handballPager = (ViewPager) mRowView.findViewById(R.id.viewpager1); 
     handballPager.setAdapter(handballAdapter); 
     break; 
    //.../ 
    default: 
     //Do nothing 
    } 
    return mRowView; 
} 

instantiateItem de ViewPagerAdapter:

@Override 
public Object instantiateItem(View pager, int position) { 
    inflater = (LayoutInflater) context 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    switch(position){ 
    case 0: 
     oneLayout=inflater.inflate(R.layout.table_layout, null); 
     break; 
    case 1: 
     oneLayout=inflater.inflate(R.layout.table_layout_second, null); 
     break; 
    default: 
     oneLayout=inflater.inflate(R.layout.table_layout, null); 
     break; 
    } 
    ((ViewPager)pager).addView(oneLayout, 0); 
    return oneLayout; 
} 

Gracias! :)

Respuesta

1

Puede agradecer a ListView Recycling como causa de este problema. Ayuda a que el reciclador recupere sus artículos de fila y los reutilice.

Una solución fácil que debería resolver su problema es usar una etiqueta. Establezca la etiqueta antes de devolver rowView.

view.setTag(currentPagerPosition); 

Entonces, si convertView! = NULL usted sabe que debe haber definido la posición para que pueda hacer

int pastPagerPosition = (int) view.getTag(); 
+0

necesita encontrar la posición actual cuando se mueve el buscapersonas, es decir.) De la 1 a la página siguiente? –

+0

El ViewPagerAdapter debe tener una función getPosition() o algo así. –

+0

Gracias, Frank. Ya pensé en una solución similar, pero mi problema es obtener la posición actual de ViewPager desde el MyListViewAdapter. Hay un método llamado getCurrentItem() que debería hacerlo, pero siempre devuelvo "0". (Lo uso en el objeto de ViewPager dentro del método getView) – kiberNet

4

Ejecución setOnPageChangeListener y se puede obtener la posición actual aquí onpageselected

pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(new ImagePagerAdapter(imageUrls)); 
    pager.setCurrentItem(position); 

    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

     public void onPageScrollStateChanged(int arg0) { 
      // TODO Auto-generated method stub 
      int i = 0; 
      int newpos = arg0; 

     } 


     public void onPageScrolled(int arg0, float arg1, int arg2) { 
      // TODO Auto-generated method stub 
      int i = 0; 
      int newpos = arg0; 

     } 

     public void onPageSelected(int arg0) { 
      // TODO Auto-generated method stub 
      int i = 0; 
      position = arg0; 
      //you can get Current position here    
     } 
    }); 

Esperanza ¡¡¡esto ayuda!!!

+0

La posición actual de ViewPager funciona de esta manera, ¡gracias Kalai! – kiberNet

+0

Marque su respuesta como kiberNet –

Cuestiones relacionadas