为了账号安全,请及时绑定邮箱和手机立即绑定

Android中从ViewPager中删除片段页

Android中从ViewPager中删除片段页

不负相思意 2019-07-12 18:38:25
Android中从ViewPager中删除片段页我试图动态地从ViewPager中添加和删除片段,添加没有任何问题,但是删除并不像预期的那样有效。每次我要删除当前项时,最后一个项将被删除。我还尝试在适配器的getItemPosition方法中使用FragmentStatePagerAdapter或返回Location_None。我做错什么了?下面是一个基本的例子:MainActivity.javapublic class MainActivity extends FragmentActivity implements TextProvider {     private Button mAdd;     private Button mRemove;     private ViewPager mPager;     private MyPagerAdapter mAdapter;     private ArrayList<String> mEntries = new ArrayList<String>();     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         mEntries.add("pos 1");         mEntries.add("pos 2");         mEntries.add("pos 3");         mEntries.add("pos 4");         mEntries.add("pos 5");         mAdd = (Button) findViewById(R.id.add);         mRemove = (Button) findViewById(R.id.remove);         mPager = (ViewPager) findViewById(R.id.pager);         mAdd.setOnClickListener(new OnClickListener() {             @Override             public void onClick(View view) {                 addNewItem();             }         });         mRemove.setOnClickListener(new OnClickListener() {             @Override             public void onClick(View view) {                 removeCurrentItem();             }         });         mAdapter = new MyPagerAdapter(this.getSupportFragmentManager(), this);         mPager.setAdapter(mAdapter);     }     private void addNewItem() {         mEntries.add("new item");         mAdapter.notifyDataSetChanged();     }     private void removeCurrentItem() {         int position = mPager.getCurrentItem();         mEntries.remove(position);         mAdapter.notifyDataSetChanged();     }     @Override     public String getTextForPosition(int position) {         return mEntries.get(position);     }     @Override     public int getCount() {         return mEntries.size();     }
查看完整描述

3 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

ViewPager不会用上面的代码删除您的片段,因为它会将多个视图(在您的情况下是片段)加载到内存中。除了可视视图之外,它还将视图加载到可见视图的任何一侧。这提供了从视图到视图的平滑滚动,这使得ViewPager非常酷。

要达到你想要的效果,你需要做几件事。

  1. 将FragmentPagerAdapter更改为FragmentStatePagerAdapter。这样做的原因是FragmentPagerAdapter将永远保存它加载到内存中的所有视图。FragmentStatePagerAdapter处理当前视图和可遍历视图之外的视图。

  2. 重写适配器方法getItemPosition(如下所示)。当我们打电话mAdapter.notifyDataSetChanged();ViewPager询问适配器以确定在定位方面发生了哪些变化。我们使用这种方法来表示所有的东西都改变了,所以重新处理所有的视图定位。

这是密码.。

private class MyPagerAdapter extends FragmentStatePagerAdapter {

    //... your existing code

    @Override
    public int getItemPosition(Object object){
        return PagerAdapter.POSITION_NONE;
    }}


查看完整回答
反对 回复 2019-07-12
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

从视图寻呼机中删除片段页的工作解决方案

public class MyFragmentAdapter extends FragmentStatePagerAdapter {

    private ArrayList<ItemFragment> pages;

    public MyFragmentAdapter(FragmentManager fragmentManager, ArrayList<ItemFragment> pages) {
        super(fragmentManager);
        this.pages = pages;
    }

    @Override
    public Fragment getItem(int index) {
        return pages.get(index);
    }

    @Override
    public int getCount() {
        return pages.size();
    }

    @Override
    public int getItemPosition(Object object) {
        int index = pages.indexOf (object);

        if (index == -1)
            return POSITION_NONE;
        else
            return index;
    }}

当我需要逐个索引删除某个页面时,我会这样做

pages.remove(position); // ArrayList<ItemFragment>adapter.notifyDataSetChanged(); // MyFragmentAdapter

这里是我的适配器初始化。

MyFragmentAdapter adapter = new MyFragmentAdapter(getSupportFragmentManager(), pages);viewPager.setAdapter(adapter);


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 903 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信