2012-06-12 16 views
5

Desidero implementare un elenco di ViewPager. Ogni elemento di un ListView è ViewPager. Funziona così lontano. Il mio problema è che non riesco a mantenere lo stato di ViewPager. Ad esempio: quando cambio la pagina del primo ViewPager nell'elenco, scorri verso il basso fino a quando il primo ViewPager non è più visibile e poi scorri di nuovo verso l'alto, il primo ViewPager mostra nuovamente la sua prima pagina.Come mantenere lo stato di ViewPager in un controllo ListView?

Ho scritto due adattatori, uno per il ListView e uno per il ViewPager. Sto cercando di riciclare la vista dal parametro convertView del metodo getView in ListAdapter. Non sono sicuro se lo sto facendo bene e non ho idea di come farlo in ViewPagerAdapter.

Qualche idea?

Ecco il mio codice finora:

GetView da 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 da 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; 
} 

Grazie! :)

risposta

1

È possibile ringraziare ListView Recycling come causa di questo problema. Aiuta il riciclatore a reclamare i tuoi articoli di riga e riutilizzarli.

Una semplice soluzione che dovrebbe risolvere il problema è l'utilizzo del tag. Imposta il tag prima di tornare a rowView.

view.setTag(currentPagerPosition); 

Poi, se convertView! = Null si sa è necessario avere impostato la posizione in modo da poter fare

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

è necessario trovare la posizione corrente quando si muove il cercapersone cioè.) Dalla prima pagina alla pagina successiva? –

+0

ViewPagerAdapter dovrebbe avere una funzione getPosition() o qualcosa di simile in essa. –

+0

Grazie, Frank. Ho già pensato a una soluzione simile, ma il mio problema è quello di ottenere l'attuale posizione di ViewPager all'interno di MyListViewAdapter. Esiste un metodo chiamato getCurrentItem() che dovrebbe farlo, ma ottengo sempre "0" indietro. (Lo uso sull'oggetto del ViewPager all'interno del metodo getView) – kiberNet

4

Implementazione setOnPageChangeListener e Puoi ottenere la posizione attuale qui 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    
     } 
    }); 

Speranza questo aiuta!!!

+0

Ottenere la posizione corrente di ViewPager funziona in questo modo, grazie Kalai! – kiberNet

+0

Contrassegnare come risposta kiberNet –

Problemi correlati