Viewpager动态添加删除Fragment

在一次项目中,作者遇到使用ViewPager展示图片并需要动态添加和删除Fragment的需求。初始实现时,仅静态添加Fragment,但在尝试动态操作时,发现无法生效。经过搜索和团队讨论,发现关键在于替换Adapter类型为FragmentStatePagerAdapter,并重写getItemPosition()方法返回POSITION_NONE。这种方法能确保动态操作的正确执行。此博客旨在分享解决方案,帮助遇到类似问题的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前一个项目有个需求是浏览图片,然后用到ViewPager,然后觉得没什么的,就按照ViewPager的标准写好,但是后来需要改动(你懂的),浏览自己的图片需要加上动态添加和删除!好吧,我加,但是问题来了,我在把ViewPager的数据源删了或者添加,然后调用adapter.notifyDataSetChanged(),撒用都没有。
百度了,也没有好点的解决方法,抓狂下,最终还是问了同组的大神,他鄙视的跟我说,其实就是改adapter一个方法就好!膜拜ing。。。。。。

下面是主要的主要代码

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private List<Fragment> fragments = null;
    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) {
// TODO Auto-generated method stub
        return PagerAdapter.POSITION_NONE;
    }

    @Override
    public int getCount() {
        return fragments.size();//hotIssuesList.size();
    }
}

以下是Activty的代码

public class ViewPagerActivity extends GBaseActivity {
    private static final String TAG = "ViewPagerActivity";
    private ViewPagerAdapter adapter;
    private ViewPager view_pager;
    private RelativeLayout rl_top;
    private TextView delete;
    private TextView title;
    private TextView add;
    List<Fragment> fragmentList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);
        initView();
    }

    private void initView() {
        view_pager = (ViewPager)findViewById(R.id.view_pager);
        rl_top = (RelativeLayout) findViewById(R.id.rl_top);
        delete = (TextView) findViewById(R.id.delete);
        title = (TextView) findViewById(R.id.title);
        add = (TextView) findViewById(R.id.add);
        initFragment();
        adapter = new ViewPagerAdapter(this,getSupportFragmentManager(),fragmentList);
        view_pager.setAdapter(adapter);
        view_pager.setCurrentItem(0);
        title.setText("标题" +0);
        view_pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                title.setText("标题" + position);
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ImageFragment fragment = new ImageFragment(ViewPagerActivity.this,"http://f.hiphotos.baidu.com/image/h%3D360/sign=9a7ed298271f95cab9f594b0f9167fc5/72f082025aafa40f468f193ba964034f79f0198e.jpg",fragmentList.size());
                fragmentList.add(fragment);
                adapter.notifyDataSetChanged();
            }
        });
        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(fragmentList.size()> 1){
                    fragmentList.remove(view_pager.getCurrentItem());
                    adapter.notifyDataSetChanged();
                }
            }
        });
    }

    private void initFragment() {
        for (int i = 0; i < 4; i++) {
            ImageFragment fragment = new ImageFragment(this,"http://f.hiphotos.baidu.com/image/h%3D360/sign=9a7ed298271f95cab9f594b0f9167fc5/72f082025aafa40f468f193ba964034f79f0198e.jpg",i);
            fragmentList.add(fragment);
        }
    }

}

代码是demo来的,其他就不贴了,功能实现了,xml的可以自己配一下,测了一下,行了!!后来查看的原理,
1.将FragmentPagerAdapter 替换成FragmentStatePagerAdapter,因为前者只要加载过,fragment中的视图就一直在内存中,在这个过程中无论你怎么刷新,清除都是无用的,直至程序退出; 后者 可以满足我们的需求。

2.我们可以重写Adapter的方法–getItemPosition(),让其返回PagerAdapter.POSITION_NONE即可。
希望可以帮到大家,大神或者重复了勿喷!!!欢迎留言

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值