Android:ViewPaper动态添加移除第一页
问题:
动态改变itemList之后,调用notifyDataSetChanged();没有作用。
原因:
原因是PagerAdapter内部的getItemPosition方法获取的值是固定POSITION_UNCHANGED,表示未改变,所以不更新。
解决:
要更新则重写这个方法,返回POSITION_NONE。那么调用notifyDataSetChanged()方法每个界面都会更新。如果是动态添加移除最后一页,那么前面所有item是不需要更新的,就会造成资源浪费。这里我是动态添加移除第一页,其他每页都会前移一页,所以每项item都是有改变的,所以需要所有都更新,我这边就直接返回POSITION_NONE了。如需求不同可根据getItemPosition方法传进来的object参数(实际上就是itemList里面的view)判断是否需要更新来返回不同值。
完整参考代码:
public class MyAdapter extends PagerAdapter {
private final List<View> itemList;
public MyAdapter(List<View> list) {
this.itemList = list;
}
public void addToFirst(View view) {
if (itemList != null && !itemList.isEmpty()) {
View currentView = itemList.get(0);
if (currentView != null && currentView == view) {
return;
}
itemList.add(0, view);
notifyDataSetChanged();
}
}
public boolean isFirstView(View view) {
if (itemList != null && !itemList.isEmpty()) {
return itemList.get(0) == view;
}
return false;
}
public void removeFirstItem() {
if (itemList != null && !itemList.isEmpty()) {
itemList.remove(0);
notifyDataSetChanged();
}
}
@Override
public int getCount() {
return itemList.size();
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = itemList.get(position);
container.addView(itemList.get(position));
return view;
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
if (object instanceof View){
container.removeView((View) object);
}
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view == o;
}
}