Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:如何在TabLayout中替换/删除部分寻呼机适配器内的片段_Java_Android_Android Fragments - Fatal编程技术网

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

Java Android:如何在TabLayout中替换/删除部分寻呼机适配器内的片段,java,android,android-fragments,Java,Android,Android Fragments,:) 我正在编写一个Android应用程序,它可以做很多事情,但是我对java GUI代码有一个问题,我不能继续下去了 我想要实现的是一个tablayoutgui用户可编辑。用户可以添加、删除或修改节。我写的所有代码,让我添加节。为此,我使用了一个分区寻呼机适配器,如图所示 class SectionsPagerAdapter extends FragmentPagerAdapter { public ArrayList<Fragment> mfragList; public Ar

:)

我正在编写一个Android应用程序,它可以做很多事情,但是我对java GUI代码有一个问题,我不能继续下去了

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

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);
}
}
问题是它删除了正确的标题,但却删除了错误的片段,事实上,它曾经删除过mfragList

任何帮助都会被感激的

谢谢你们


Nico

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();
        }
    }


}
public类MainActivity扩展了AppCompatActivity{
私人小报;
私有视图寻呼机mViewPager;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTabLayout=(TabLayout)findviewbyd(R.id.tab_布局);
mViewPager=(ViewPager)findViewById(R.id.view\u pager);
List fragmentList=新建ArrayList();
列表标题=新建ArrayList();
对于(int i=0;i<3;i++){
添加(新的SampleViewPagerFragment());
标题.添加(“碎片#”+i);
}
最终CustomPagerAdapter适配器=新CustomPagerAdapter(片段列表,标题);
mViewPager.setAdapter(适配器);
mTabLayout.setupWithViewPager(mviewpage);
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
适配器。移除位置(2)处的碎片;
}
}, 3000);
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
addFragmentToAdapter(“Title”,新的SampleViewPagerFragment());
}
}, 6000);
}
私有静态类CustomPagerAdapter扩展了PagerAdapter{
私有列表MFFragmentList=newArrayList();
private List mTitle=new ArrayList();
CustomPagerAdapter(列表MFFragmentList、列表mTitle){
this.mffragmentlist=mffragmentlist;
this.mTitle=mTitle;
}
@凌驾
公共对象实例化项(视图组容器,int位置){
返回MFFragmentList.get(位置);
}
@凌驾
公共项(视图组容器、int位置、对象){
超级项目(容器、位置、对象);
容器。移除视图(位置);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
返回mTitle.get(0);
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回(视图==对象);
}
无效删除碎片位置(内部位置){
mTitle.移除(位置);
MFFragmentList.移除(位置);
notifyDataSetChanged();
}
void addFragmentToAdapter(字符串标题、片段){
增加(标题);
添加(片段);
notifyDataSetChanged();
}
}
}

你好,Vin,非常感谢您的回答。我试用了你的适配器,但发现了一些问题。首先,调用isViewFromObject的方法似乎不允许适配器(或viewpager)显示片段;(我尝试通过从按钮调用函数来添加每个片段)。因此,请注释掉该方法并重试,但我遇到了另一个问题:当尝试添加第三个片段时,应用程序会崩溃。@NicolaBarlabá那么,只有当您尝试添加新片段时,才会出现错误?如果不删除isViewFromObject方法(),我会出错,如果删除该方法,则在添加第三个片段时仍会出错(第节)@NicolaBarlabá检查更新的程序,它将添加新片段并从列表中删除片段。我看到了,但它仍然有isViewFromObject,它不允许适配器显示我告诉过你的片段。此外,在我的应用程序中,我需要让用户添加片段,所以我从按钮调用addFrag方法。当用户(我)添加第一个碎片时,它工作,第二个碎片工作,第三个碎片崩溃!所以我不明白更新后的代码如何解决这个问题。
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();
        }
    }


}