【问题标题】:OnPageChangeListener in ViewPager adapter?ViewPager 适配器中的 OnPageChangeListener?
【发布时间】:2017-03-23 19:51:13
【问题描述】:

我有一个带有适配器的常规 ViewPager:

public class MyDialogFragment extends DialogFragment {

    private ViewPager viewPager;

    private MyViewPagerAdapter myViewPagerAdapter;

    private City city;

    public static MyDialogFragment newInstance() {
        MyDialogFragment fragment = new MyDialogFragment();

        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_layout, container, false);

        viewPager = (ViewPager) v.findViewById(R.id.viewPager);

        city = Parcels.unwrap(getArguments().getParcelable("city"));

        myViewPagerAdapter = new MyViewPagerAdapter(getContext());
        viewPager.setAdapter(myViewPagerAdapter);

        viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                // Page changed
            }
        });

        return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public class MyViewPagerAdapter extends PagerAdapter {

        private Context context;

        private LayoutInflater layoutInflater;

        public MyViewPagerAdapter(Context context) {
            this.context = context;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = layoutInflater.inflate(R.layout.city_layout, container, false);

            ImageView imageView = (ImageView) view.findViewById(R.id.cityImage);

            Glide.with(context)
                    .load(city.getImage())
                    .into(imageView);
            }

            container.addView(view);

            return view;
        }

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

        @Override
        public boolean isViewFromObject(View view, Object obj) {
            return view == ((View) obj);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
}

如您所见,我在ViewPager 上设置了页面更改侦听器。但是我需要能够在页面发生更改时通知适配器,以便我可以修改适配器的ImageView。我该怎么做?

【问题讨论】:

标签: android android-layout android-fragments android-viewpager


【解决方案1】:

为你的适配器类添加一个方法

public class MyViewPagerAdapter extends PagerAdapter {

    ...
    public void pageChanged(int position) {
        // Do something
    }
    ...
}

之后在您的OnPageChangeListener 中使用该方法

@Override
public void onPageSelected(int position) {
    myViewPagerAdapter.pageChanged(position);
}

【讨论】:

  • 如何在适配器中获取ImageView 以便进行修改?
【解决方案2】:

一种方法是在您的适配器中创建一个数据结构,以将分页器视图映射到其位置。 SparseArray 最有效:

private SparseArray<View> pageMap = new SparseArray<>();

然后在适配器的instantiateItem()方法中,将视图添加到SparseArray

public Object instantiateItem(ViewGroup container, int position) {
    ...
    pageMap.put(position, view);
    ...
}

现在在您的OnPageChangeListener 中,您可以执行以下操作:

@Override
public void onPageSelected(int position) {
    View view = adapter.getView(pos);
    if (view != null) {
        ImageView iv = (ImageView) view.findViewById(R.id.your_image_view);
        // You now have the image view
    }
}

确保在适配器的 destroyItem() 方法中从 SparseArray 中删除视图:

@Override 
public void destroyItem(ViewGroup container, int position, Object object) {
    pageMap.remove(position);
    ...
}

【讨论】:

    【解决方案3】:

    您可以使用带有 imagelist 的构造函数来传递,并在下一页自动调用..在您的代码中将被修改为 ::: ArrayList imageList=new ArrayList();

    imageList.add("ImagePath here");
    myViewPagerAdapter = new MyViewPagerAdapter(getContext(),imageList);
    viewPager.setAdapter(myViewPagerAdapter);
    

    那么你的适配器会像 ::

        public class MyViewPagerAdapter extends PagerAdapter {
    
                private Context context;
                private ArrayList<String> imageList
                private LayoutInflater layoutInflater;
    
                public MyViewPagerAdapter(Context context,ArrayList<String> imageList) {
                    this.context = context;
                    this.imageList = imageList;
                }
    
                @Override
                public Object instantiateItem(ViewGroup container, int position) {
                    layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
                    View view = layoutInflater.inflate(R.layout.city_layout, container, false);
    
                    ImageView imageView = (ImageView) view.findViewById(R.id.cityImage);
    
                    Glide.with(context)
                            .load(imageList.get(position))            // This will be changes like 
                            .into(imageView);
                    }
    
                    container.addView(view);
    
                    return view;
                }
    
                @Override
                public int getCount() {
                    return city.size();
                }
    
                @Override
                public boolean isViewFromObject(View view, Object obj) {
                    return view == ((View) obj);
                }
    
                @Override
                public void destroyItem(ViewGroup container, int position, Object object) {
                    container.removeView((View) object);
                }
            }
    

    完成了.. 在此之后,有一些建议是 - 请在使用 viewpager 时使用 arraylist .. 现在你只需从 bundle.. 你可以对数组列表做同样的事情, 只需通过一次传递整个数组列表来接收来自同一个包的数组列表。 所以你不需要找到页面更改事件..viewpager 会自动处理.. 这是发送和接收可解析数组列表的方法

     // while sending the list
            Bundle bundle = new Bundle();
            bundle.putParcelableArrayList("citylist", new ArrayList<City>());
    
            // while receiving the list
            ArrayList<City> citylist = getIntent().getParcelableArrayListExtra("citylist");
    

    之后只需获取所有图像并添加到 imagelist 数组中

           for (int i = 0; i < citylist.size(); i++) {
                imageList.add(citylist.get(i).getImage());
            }
    

    并在

    中传递这个imageList
    myViewPagerAdapter = new MyViewPagerAdapter(getContext(),imageList);
    viewPager.setAdapter(myViewPagerAdapter);
    

    如果需要更多帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多