android: 如何在 onPageSelected 方法中为 ViewPager 调用 setAdapter?

标签 android android-fragments

我的 ViewPager 适配器需要根据当前 Activity 页面进行重置。我想使用 OnPageChangeListener 来完成。 我的适配器的部分代码如下:

    class CustomPagerAdapter extends PagerAdapter {
            static int currpage = 0; // current selected page
            ......
            @Override
            public Object instantiateItem(ViewGroup collection, int position) {     
                LayoutInflater inflater = LayoutInflater.from(mContext);
                View layout = inflater.inflate(R.layout.layout_home_viewpager, collection, false);

               // some code that changes layout dynamically    
               // according to variable position and currpage
               ......

               collection.addView(layout);
               return layout;
            }
    }

这是我的 viewpager 的代码(在 fragment 的 OnCreateView 内):

    ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            CustomPagerAdapter.currpage = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    };
    viewPager.addOnPageChangeListener(onPageChangeListener);
    viewPager.setAdapter(customPagerAdapter);

以下代码只会被调用一次(创建 fragment View 时):

     viewPager.setAdapter(customPagerAdapter);

我打算在 Activity 更改时调用 setadapter。但是如果我将代码更改为:

    @Override
    public void onPageSelected(int position) {
        CustomPagerAdapter.currpage = position; // flag for setAdapter
        viewPager.setAdapter(customPagerAdapter);
    }

viewpager 将无法滑动。

由于检测页面更改的唯一方法是向 viewPager 注册一个监听器,而我们不能在监听器的方法内部调用 setAdapter,当所选页面更改时,为 viewpager 重置适配器的最佳方法是什么?

最佳答案

我不太明白“需要重置”是什么意思。如果您重置适配器,viewpager 将返回到第一页,这完全不是您希望 viewpager 在用户更改页面时执行的操作。

但问题更深。 ViewPager 不像 ListView 那样工作,它不会回收其 View ,也不会根据底层数据集中的更改重新绑定(bind)它们。它基本上只是一个具有分页和滑动功能的 ViewGroup。实际上,这意味着您需要跟踪您的 View 、它们的位置并将它们绑定(bind)到 onInstantiate 和 onDestroy 方法之外的数据,因此考虑到您正在使用的 API 的限制,基本上您的方法不是最佳的.

我的建议是更改适配器并使用列表保存对 View 的引用,将 View 逻辑移至实例化方法的外部并在每次页面更改时调用它。

这是一个功能示例:

 class CustomPagerAdapter extends PagerAdapter {
        List<View> mViews = new ArrayList<>;
        ......
        @Override
        public Object instantiateItem(ViewGroup collection, int position) {     
            LayoutInflater inflater = LayoutInflater.from(mContext);
            View layout = inflater.inflate(R.layout.layout_home_viewpager, collection, false);
           mViews.add(layout);
           collection.addView(layout);
           populateView(layout);
           return layout;
        }

        public void populateView(int position){
           if(position < mView.size()){
              populateView(mViews.get(position));
           }
        }

        private void populateView(View layout){
           // some code that changes layout dynamically    
           // according to variable position and currpage
           ......
        }
}

然后,在你的监听器上:

@Override
public void onPageSelected(int position) {
    customPagerAdapter.populateView(position);
}

这应该可以解决您的问题。

关于android: 如何在 onPageSelected 方法中为 ViewPager 调用 setAdapter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38280232/

相关文章:

java - 如何在android上制作一个使用json数据的按钮

java - 生成多个 R.java 并将它们组合起来?

android - 管理 fragment ,公共(public)静态 viewpager

java - Butterknife 8.4.0 重新运行应用后找不到 View 。它得到一个 NullPointerException

java - 处理 Android fragment 事务问题的正确/最佳方法

Android:使用形状绘制 "X"

android - Firebase Firestore 子集合安全查询

android - HTML5 中的应用程序缓存在 Android PhoneGap 应用程序中不起作用

java - 具有自定义布局的 fragment 内的 Google map

android - 为什么即使 fragment 不在前台也会调用 fragment 的 onStart 和 onResume 方法