Viewpager动态添加删除Fragment ,viewPageadapter.notifyDataSetChanged()方法不管用问题

最近写了个新功能,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;
        }
    }

}

希望可以帮到同样遇到此需求的人;



动态添加 FragmentViewPager 中,需要使用 FragmentPagerAdapterFragmentStatePagerAdapter。以下是添加 Fragment 的步骤: 1. 创建 FragmentPagerAdapterFragmentStatePagerAdapter 的子类: ``` public class MyPagerAdapter extends FragmentPagerAdapter { private List<Fragment> mFragmentList = new ArrayList<>(); public MyPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } public void addFragment(Fragment fragment) { mFragmentList.add(fragment); notifyDataSetChanged(); } } ``` 在这个子类中,我们需要重写 getItem() 方法,返回指定位置的 Fragment 对象;重写 getCount() 方法,返回 Fragment 的数量;还需要添加一个 addFragment() 方法,用于添加 Fragment。 2. 创建 ViewPager 对象,并设置 Adapter: ``` ViewPager viewPager = findViewById(R.id.viewpager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); ``` 3. 创建 Fragment 对象: ``` MyFragment fragment = new MyFragment(); ``` 4. 添加 FragmentAdapter: ``` adapter.addFragment(fragment); ``` 5. 刷新 Adapter: ``` adapter.notifyDataSetChanged(); ``` 这样就添加了一个 FragmentViewPager 中。如果需要替换 ViewPager 中的 Fragment,可以使用 setItem() 方法方法参数是要替换的 Fragment 对象和位置。如果需要从 ViewPager 中移除 Fragment,可以使用 removeItem() 方法方法参数是要移除的位置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值