Android中从ViewPager中删除片段页

Android中从ViewPager中删除片段页

我试图动态地从ViewPager中添加和删除片段,添加没有任何问题,但是删除并不像预期的那样有效。

每次我要删除当前项时,最后一个项将被删除。

我还尝试在适配器的getItemPosition方法中使用FragmentStatePagerAdapter或返回Location_None。

我做错什么了?

下面是一个基本的例子:

MainActivity.java

public 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();
    }
不负相思意
浏览 904回答 3
3回答

炎炎设计

ViewPager不会用上面的代码删除您的片段,因为它会将多个视图(在您的情况下是片段)加载到内存中。除了可视视图之外,它还将视图加载到可见视图的任何一侧。这提供了从视图到视图的平滑滚动,这使得ViewPager非常酷。要达到你想要的效果,你需要做几件事。将FragmentPagerAdapter更改为FragmentStatePagerAdapter。这样做的原因是FragmentPagerAdapter将永远保存它加载到内存中的所有视图。FragmentStatePagerAdapter处理当前视图和可遍历视图之外的视图。重写适配器方法getItemPosition(如下所示)。当我们打电话mAdapter.notifyDataSetChanged();ViewPager询问适配器以确定在定位方面发生了哪些变化。我们使用这种方法来表示所有的东西都改变了,所以重新处理所有的视图定位。这是密码.。private&nbsp;class&nbsp;MyPagerAdapter&nbsp;extends&nbsp;FragmentStatePagerAdapter&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//...&nbsp;your&nbsp;existing&nbsp;code &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getItemPosition(Object&nbsp;object){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;PagerAdapter.POSITION_NONE; &nbsp;&nbsp;&nbsp;&nbsp;}}

慕尼黑的夜晚无繁华

从视图寻呼机中删除片段页的工作解决方案public&nbsp;class&nbsp;MyFragmentAdapter&nbsp;extends&nbsp;FragmentStatePagerAdapter&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;ArrayList<ItemFragment>&nbsp;pages; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MyFragmentAdapter(FragmentManager&nbsp;fragmentManager,&nbsp;ArrayList<ItemFragment>&nbsp;pages)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(fragmentManager); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.pages&nbsp;=&nbsp;pages; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Fragment&nbsp;getItem(int&nbsp;index)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pages.get(index); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getCount()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;pages.size(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;getItemPosition(Object&nbsp;object)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;index&nbsp;=&nbsp;pages.indexOf&nbsp;(object); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(index&nbsp;==&nbsp;-1) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;POSITION_NONE; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;index; &nbsp;&nbsp;&nbsp;&nbsp;}}当我需要逐个索引删除某个页面时,我会这样做pages.remove(position);&nbsp;//&nbsp;ArrayList<ItemFragment>adapter.notifyDataSetChanged();&nbsp;//&nbsp;MyFragmentAdapter这里是我的适配器初始化。MyFragmentAdapter&nbsp;adapter&nbsp;=&nbsp;new&nbsp;MyFragmentAdapter(getSupportFragmentManager(),&nbsp;pages);viewPager.setAdapter(adapter);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android