常に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) {}
}