Android:如何在TabLayout中替换/删除部分寻呼机适配器内的片段

时间:2017-06-12 13:59:14

标签: java android android-fragments

:)

我正在写一个做很多事情的Android应用程序,但是我遇到了java GUI代码的问题而且我无法继续。

我想要实现的是用户可编辑的TabLayout gui。用户可以添加,删除或修改部分。我写了所有让我添加部分的代码。为此,我使用了分区寻呼机适配器,如图所示

class SectionsPagerAdapter extends FragmentPagerAdapter {

public ArrayList<Fragment> mfragList;
public ArrayList<String> mfragtit;

public SectionsPagerAdapter(FragmentManager fm, ArrayList<Fragment> mFragList, ArrayList<String> mFragTit) {
    super(fm);
    this.mfragList=mFragList;
    this.mfragtit=mFragTit;
}

@Override
public Fragment getItem(int position) {
    return this.mfragList.get(position);
}

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

@Override
public CharSequence getPageTitle(int position) {

    return this.mfragtit.get(position);
}

public void addFrag(Fragment frag, String tit){
    this.mfragList.add(frag);
    this.mfragtit.add(tit);

}

public void delFrag(int index){
    this.mfragList.remove(index-1);
    this.mfragtit.remove(index-1);
}
}

嗯,我是Android的新手,我对此代码的理解是这个类在被调用时需要两个Arraylist: mfragList mfragtit < / strong>,其中包含每个部分的片段及其标题。然后,当创建此适配器时,它将被设置为视图寻呼机的适配器,它应该是包含视图的对象。

所以当我试图删除一个部分时,我得到了第一个问题。为此,我想从适配器删除标题和片段,然后notifydatasetChanged然后再次为视图寻呼机设置适配器。但实际上它并没有起作用(即使我只是在没有设置适配器的情况下才会改变它)。

我在MainActivity中做的是这样的:

                        ad.delFrag(parseInt(elim_i)+1); //ad is the adapter declared as field 
                        ad.notifyDataSetChanged();
                        mViewPager.setAdapter(ad);
                        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
                        tabLayout.setupWithViewPager(mViewPager);

问题在于它删除了正确的标题但错误的片段,实际上它删除了 mfragList 中的最后一个片段

任何帮助都会受到赞赏。

谢谢你们。

尼科

1 个答案:

答案 0 :(得分:0)

FragmentAdapter内部具有加载片段的缓存。所以它表现得像这样。试试这个适配器

public class MainActivity extends AppCompatActivity {


    private TabLayout mTabLayout;

    private ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
        mViewPager = (ViewPager) findViewById(R.id.view_pager);

        List<Fragment> fragmentList = new ArrayList<>();
        List<String> title = new ArrayList<>();

        for (int i =0; i < 3; i++) {
            fragmentList.add(new SampleViewPagerFragment());
            title.add("Fragment #" + i);
        }

        final CustomPagerAdapter adapter = new CustomPagerAdapter(fragmentList, title);
        mViewPager.setAdapter(adapter);

        mTabLayout.setupWithViewPager(mViewPager);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                adapter.removeFragmentAtPosition(2);
            }
        }, 3000);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                adapter.addFragmentToAdapter("Title", new SampleViewPagerFragment());
            }
        }, 6000);

    }


    private static class CustomPagerAdapter extends PagerAdapter {

        private List<Fragment> mFragmentList = new ArrayList<>();
        private List<String> mTitle = new ArrayList<>();

        CustomPagerAdapter(List<Fragment> mFragmentList, List<String> mTitle) {
            this.mFragmentList = mFragmentList;
            this.mTitle = mTitle;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            return mFragmentList.get(position);
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            super.destroyItem(container, position, object);
            container.removeViewAt(position);
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return mTitle.get(0);
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return (view == object);
        }


        void removeFragmentAtPosition(int position) {
            mTitle.remove(position);
            mFragmentList.remove(position);

            notifyDataSetChanged();
        }

        void addFragmentToAdapter(String title, Fragment fragment) {
            mTitle.add(title);
            mFragmentList.add(fragment);

            notifyDataSetChanged();
        }
    }


}