5

ViewPagersのリストを実装したいと思います。ListViewのすべてのアイテムはViewPagerです。これは今のところ機能します。私の問題は、ViewPagerの状態を維持できないことです。たとえば、リストの最初のViewPagerのページを変更し、最初のViewPagerが表示されなくなるまで下にスクロールしてからもう一度上にスクロールすると、最初のViewPagerに最初のページが再び表示されます。

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

何か案は?

これまでの私のコードは次のとおりです。

MyListAdapterからのgetView:

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

ViewPagerAdapterからの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;
}

ありがとう!:)

4

2 に答える 2

4

setOnPageChangeListenerを実装すると、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             
        }
    });

お役に立てれば!!!

于 2012-06-12T14:08:10.723 に答える
1

この問題の原因として、ListViewRecyclingに感謝することができます。これは、リサイクラーが行アイテムを再利用して再利用するのに役立ちます。

問題を解決する簡単な修正の1つは、タグを使用することです。rowViewを返す前にタグを設定してください。

view.setTag(currentPagerPosition);

次に、convertView!= nullの場合、位置を設定しておく必要があります。

int pastPagerPosition = (int) view.getTag();
于 2012-06-12T13:19:44.260 に答える