:)
我正在写一个做很多事情的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 中的最后一个片段
任何帮助都会受到赞赏。
谢谢你们。
尼科
答案 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();
}
}
}