2012-06-12 8 views
5

ViewPagerのリストを実装したいと思います。 ListViewの各項目はViewPagerです。これまでのところ動作します。私の問題は、私はViewPagerの状態を維持できないということです。たとえば、リスト内の最初のViewPagerのページを変更するとき、最初のViewPagerが表示されなくなるまでスクロールしてからもう一度スクロールすると、最初のViewPagerに最初のページが再び表示されます。ListViewでViewPagerの状態を維持する方法は?

私はListView用とViewPager用の2つのアダプタを作成しました。私は、ListAdapterのgetViewメソッドのconvertViewパラメータからビューをリサイクルしようとしています。 ViewPagerAdapterでそれをどうやって行うのか、私が正しくやっているかどうかはわかりません。

アイデア?ここ

は、これまでの私のコードです:MyListAdapterから

getViewメソッド:ViewPagerAdapterから

@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:

@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; 
} 

ありがとう! :)

答えて

1

この問題の原因としてListView Recyclingに感謝します。 リサイクラーが行項目を再利用して再利用するのを助けます。

問題を解決する簡単な修正は、タグを使用することです。 rowViewを返す前にタグを設定します。

その後
view.setTag(currentPagerPosition); 

convertView!= nullをあなたが

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

ページャが移動すると、現在の位置を見つける必要があります。)最初のページから次のページに移動しますか? –

+0

ViewPagerAdapterにはgetPosition()関数などがあります。 –

+0

ありがとう、フランク。私はすでに同様のソリューションについて考えていましたが、私の問題はMyListViewAdapterの内部から現在のViewPagerの位置を取得することです。 getCurrentItem()と呼ばれるメソッドがありますが、私はいつも "0"を返します。 (私は、getViewメソッド内でViewPagerのオブジェクトに使用します) – kiberNet

4

実装setOnPageChangeListenerを行うことができますので、あなたが位置を設定しておく必要があります知っているとあなたがここに現在の位置を取得することができますが

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    
     } 
    }); 

希望をonpageselected場合これは助けになる!

+0

ViewPagerの現在の位置を取得する方法は、このように動作します。 – kiberNet

+0

答えをkiberNetとして親切に付ける –

関連する問題