Viewpager动态添加删除Fragment

来源:互联网 发布:域名价格排行榜 编辑:程序博客网 时间:2024/05/18 11:24

之前一个项目有个需求是浏览图片,然后用到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即可。
希望可以帮到大家,大神或者重复了勿喷!!!欢迎留言

0 0