最近写了个新功能,viewpage实现图片大图预览,删除指定的图片,我试了好多方法,都删除不了对应的fragment;
记录下我踩的坑:
首先 从图片集合中先移除了对应的图片;
imglist.remove(chosePostion);
接着 从fragment集合中移出了对应的fragment
mPhotoDetailFragmentList.remove(chosePostion);
然后 通过viewpage移出对应的fragment
viewpager.removeViewAt(chosePostion);
此时就会报空指针异常
而且我们刷新viewPageadapter.notifyDataSetChanged()也不管用。
这时我们就要看看fragment 适配器视图缓存问题了,我们一般viewPageadapter继承的是FragmentPagerAdapter ,而FragmentPagerAdapter 只要加载过,就会把视图缓存到内存中,无论你怎么刷新适配器,都是没用的,除非退出程序,才能可以刷新;
如果我们继承的是FragmentStatePagerAdapter,那么就可以实现添加删除数据,实现适配器的刷新了;
所以我们需要修改下我们的适配器:
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
private List<Fragment> fragments = new ArrayList<>();
private Context context;
public ViewPagerAdapter(Context context, FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.context = context;
this.fragments = fragments;
notifyDataSetChanged();
}
public ViewPagerAdapter(Context context, FragmentManager fm) {
super(fm);
this.context = context;
notifyDataSetChanged();
}
@Override
public Fragment getItem(int arg0) {
return fragments.get(arg0);
}
@Override
public int getItemPosition(Object object) {
//注意:默认是PagerAdapter.POSITION_UNCHANGED,不会重新加载
return PagerAdapter.POSITION_NONE;
}
@Override
public int getCount() {
return fragments.size();
}
}
在这儿需要注意一点 我们需要重写Adapter的getItemPosition()方法,因为getItemPosition()方法默认返回的是PagerAdapter.POSITION_UNCHANGED,不会重新加载,我们需重写,让其返回PagerAdapter.POSITION_NONE,使其重新加载;
activity代码:
public class PhotoDetalislistActivity extends BaseActivity {
@Bind(R.id.viewpager)
ViewPagerFixed viewpager;
@Bind(R.id.img_title_back)
ImageView imgTitleBack;
@Bind(R.id.img_title_delect)
ImageView imgTitleDelect;
@Bind(R.id.tv_text)
TextView tvText;
private List<Fragment> mPhotoDetailFragmentList = new ArrayList<>();
private int number;
private List<String> imglist;
private List<String> mdata = new ArrayList<>();
private int chosePostion = 0;
@Override
public int getLayoutId() {
return R.layout.activity_photo_list_detail;
}
@Override
public void initPresenter() {
}
@Override
public void initView() {
number = getIntent().getIntExtra("number", -1);//初始化显示第几页
imglist = (List<String>) getIntent().getSerializableExtra("list"); //图片地址集合
createFragment(imglist);//初始化fragment
initViewPager(); //初始化viewpage
tvText.setText((number+1)+"/"+imglist.size()); //显示滑到第几个了
}
private void createFragment(List<String> newsPhotoDetail) {
mdata.clear();
mdata.addAll(newsPhotoDetail);
mPhotoDetailFragmentList.clear();
for (int i = 0; i < newsPhotoDetail.size(); i++) {
UploadPhotoDetailFragment fragment = new UploadPhotoDetailFragment();
Bundle bundle = new Bundle();
bundle.putString("imgurl", newsPhotoDetail.get(i));
fragment.setArguments(bundle);
mPhotoDetailFragmentList.add(fragment);
}
}
private ViewPagerAdapter photoPagerAdapter;
private void initViewPager() {
photoPagerAdapter = new ViewPagerAdapter(this,getSupportFragmentManager(), mPhotoDetailFragmentList);
viewpager.setAdapter(photoPagerAdapter);
viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {//监听viewpage滑动
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
tvText.setText((position+1)+"/"+imglist.size());
chosePostion = position;
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
if (number != -1) {
viewpager.setCurrentItem(number); //设置viewpage显示第几个
}
}
@OnClick({R.id.img_title_back, R.id.img_title_delect})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.img_title_back:
finish();
break;
case R.id.img_title_delect:
imglist.remove(chosePostion);//移出图片集合中对应的数据
if (chosePostion == imglist.size()){
number = chosePostion-1;
}else {
number = chosePostion;
}
mPhotoDetailFragmentList.remove(viewpager.getCurrentItem());//移出fragment集合中对应的fragment
photoPagerAdapter.notifyDataSetChanged();//刷新adapter
tvText.setText((number+1)+"/"+imglist.size());
break;
}
}
}
希望可以帮到同样遇到此需求的人;