android - 添加/删除 PagerAdapter/ViewPager 问题 Android 的 View

标签 android

我想始终保留 3 个 View 的列表。该应用程序从位置 1 开始(在位置 0、1、2 之外)。当有人滚动到位置 0 时,我想删除 View 2,并在位置 0 之前创建一个 View 。这样,在用户看来, View 是无限的。同样,当有人滚动到位置 2 时,我想删除位置 0 的 View 并在末尾添加一个。

但是我在添加和删除 View 时遇到了问题。当我到达位置 0 时,没有任何变化,除非我尝试滚动到位置 0(到位置 -1,即边界被击中)。那时,我可以看到它是我的 View 的边界,但是 setCurrentItem(1,false) 被触发,我又回到了 View 的中间。当我滚动到位置 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; 

        }

    });
}

寻呼机适配器

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


}

最佳答案

instantiateItem()方法默认在内存中创建2个 View 页面。因此,当您滑动到第二页时,将重新创建 0 页,因为它超出了内存中保存的 2 页的范围。请尝试使用

myViewPager.setOffscreenPageLimit(numberOfPages) 

接收一个整数作为参数并声明在回收它们之前应该保留多少页的方法。

关于android - 添加/删除 PagerAdapter/ViewPager 问题 Android 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12505725/

相关文章:

Android 破折号/虚线问题?

android - 如何在 RxJava 中链接任务

Android AccessibilityService getEventTime() 时间格式

android - 适用于 Android 的 Xamarin.Forms Listview 上下文操作

android - 在 Genexus 智能设备同步后在服务器中执行进程

java - 只取 ".jpg"(Android)

android - 告诉 DownloadManager 覆盖现有文件

android - 使textview在recyclerView中展开

android - 底部工作表不显示所有布局

java - 获取请求在 Android 设备上不起作用,但它在我的电脑上起作用