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