我的 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/