2

常に3つのビューのリストを保持したいと思います。アプリは位置 1 から開始します (位置 0、1、2 のうち)。誰かが位置 0 にスクロールすると、ビュー 2 を削除し、位置 0 の前にビューを作成したいと思います。このようにして、ユーザーには無制限のビューがあるように見えます。同様に、誰かが位置 2 にスクロールすると、位置 0 のビューを削除し、最後に 1 つ追加したいと思います。

ただし、ビューの追加と削除の両方に問題があります。位置 0 に到達しても、位置 0 を超えて (位置 -1 まで、つまり境界に到達するまで) スクロールしない限り、何も変わりません。その時点で、それがビューの境界であることがわかりますが、その後setCurrentItem(1,false)トリガーされ、ビューの中央に戻されます。2 番目の位置までスクロールすると、2 番目の位置が更新されていることがわかります。ただし、位置 0 と 1 は同じままです。

位置 2 にスクロールしても、何も起こりません。ただし、境界までスクロールしようとすると、何らかの理由で位置 0 が更新されてsetCurrentItem(1,false)トリガーされます。

なぜこのようなことが起こるのかわかりません。誰でもこれに光を当てることができますか?

これが私のコードです:

public class MainActivity extends Activity {


ArrayList<Integer> showThree = new ArrayList<Integer>();
    int focusedPage = 0;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        showThree.add(0,5); //adding integers 5,6,7 for positions 0,1,2
        showThree.add(1,6);
        showThree.add(2,7);

        final MyPagerAdapter adapter = new MyPagerAdapter(getApplicationContext(),showThree);
        final ViewPager myPager = (ViewPager) findViewById(R.id.mypanelpager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(1);

myPager.setOnPageChangeListener(new OnPageChangeListener(){

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == ViewPager.SCROLL_STATE_IDLE) {

//when position= 0, change the 3 views from 5,6,7 to 4,5,6. 
                 if (focusedPage == 0) {
                     showThreeMonths.set(0,4);
                     showThreeMonths.set(1,5);
                     showThreeMonths.set(2,6);
                     adapter.notifyDataSetChanged();
                     adapter.startUpdate(myPager);

                     }
                 else if (focusedPage ==2){
                        //ignore, just testing focusPage=0 for now }

                 }

//set current page to the middle of the 3 new views, which would be 
//the same view at position 0 of the old 3 views. 
//Thus user doesn't experience the views changing despite being 3 new views.

             myPager.setCurrentItem(1,false); 

        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageSelected(int position) {
            focusedPage = position; 

        }

    });
}

PagerAdapter

public class MyPagerAdapter extends PagerAdapter {

private ArrayList<Integer> showThreeMonths;
private Context ctx;

public MyPagerAdapter (Context ctx, ArrayList<Integer> showThree){
    this.ctx = ctx ;
    this.showThree = showThree;
}


@Override
public int getCount() {
    return showThree.size();
}



public Object instantiateItem(ViewGroup collection, int position ){
    //NewCustomView is a class I made that takes parameters context and an integer and creates a view based on the integer
    NewCustomView MyOwnView = new NewCustomView(ctx, showThree.get(position)); 


    View customViewLayout = MyOwnView.newLayout; //part of the class object
    collection.addView(customViewLayout);
    return customViewLayout;
 }


@Override
 public void destroyItem(ViewGroup collection, int position, Object arg2) {
     ((ViewPager) collection).removeView((ViewGroup) arg2);}


 @Override
 public Parcelable saveState() {
     return null;}


@Override
public boolean isViewFromObject(View view, Object arg1) {
    return view==arg1;}
@Override
public void startUpdate(ViewGroup collection) {}

@Override
public void finishUpdate(ViewGroup collection) {}


}
4

1 に答える 1

1

instantiateItem() メソッドは、デフォルトでメモリ内に 2 つのビュー ページを作成します。したがって、2 ページ目にスワイプすると、メモリに保存されている 2 ページの範囲外であるため、0 ページが再作成されます。使ってみてください

myViewPager.setOffscreenPageLimit(numberOfPages) 

パラメータとして整数を受け取り、リサイクルする前に保持する必要があるページ数を宣言するメソッド。

于 2012-09-20T03:39:04.167 に答える