Android PagerAdapter刷新当前显示布局
PagerAdapter基本写法
主要重写这四个方法,再将adapter设置到pageview中就可以显示可滑动的view了。
public class MyAdapter extends PagerAdapter {
list<Map<String,String>> data;
Context context;
LayoutInflater inflater;
public MyAdapter(List<Map<String,String>> data,Context context){
this.data = data;
this.context = context;
inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Map<String,String> map = data.get(position);
//创建view
View view = inflater.inflate(R.layout.pageradapter_item, container, false);
//其它布局操作
View xxView = view.findViewById(R.id.xx_view);
if(map.get("aa") == xxx){
xxView.setXX;
}else{
xxView.setYY;
}
...
//将view加入PageView中
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
adapter中是通过instantiateItem()方法来创建一页显示的view,和ListView使用的adapter的getView() 方法类似。但是ListView的adapter当数据改变的时候可以调用notifyDataSetChanged()方法来更新布局,PagerAdapter单调用notifyDataSetChanged()却没有效果。
在instantiateItem()方法中打上断点,执行发现创建PageView的时候会调用三次这个方法,position分别是0,1,2。后面每次向后滑动PageView时会调用一次方法,position是3,4,5…PageView每次会缓存3个View(可以设置),前面的view会调用destroyItem()销毁。
刷新布局
首先要获取当前布局currentView,重写PagerAdapter的setPrimaryItem方法,其中object对象就是当前显示的页面View对象,把他强转后用全局变量保存下来。
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
super.setPrimaryItem((View) container, position, object);
mCurrentView = (View) object;
}
然后可以写一个供外面调用的方法,通知adapter刷新数据,这里给当前显示的view设置一个tag
public void setStatus(int id) {
mCurrentView.setTag("changed");
this.notifyDataSetChanged();
}
重点来了,重写getItemPosition方法,在遇到我们设置了tag的view返回POSITION_NONE,这样adapter在调用notifyDataSetChanged时就会销毁这个view并重新绘制。
@Override
public int getItemPosition(Object object) {
if ("changed".equals(((View) object).getTag())) {
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
这样如果写好了 instantiateItem(BaseAdapter的getView)方法, 在Activity中调用adapter的setStatus方法就可以刷新当前布局显示了。