我有一个TabLayout和里面,我有ViewPager。我需要动态添加和删除tablayout(材料设计)中的选项卡。我可以动态添加选项卡,但在删除选项卡时,选项卡会正确删除。但viewpager最后一项被删除。所以标签没有显示特定的片段。仅供参考我已经使用FragmentPagerAdapter。动态添加和删除TabLayout(材料设计)中的标签android

我按照这个教程来实现这个

public class TabFragment extends Fragment {

public static TabLayout tabLayout;

public static ViewPager viewPager;

public static int int_items = 2;

private MyNewsFragment mMyNewsFragment;

private ArrayList mFragmentArrayList;

private TabLayoutAdapter mTabLayoutAdapter;

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

mMyNewsFragment = new MyNewsFragment();

/**

*Inflate tab_layout and setup Views.i;;a

*/

View x = inflater.inflate(R.layout.tab_layout, null);

tabLayout = (TabLayout) x.findViewById(R.id.tabs);

tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); // scorllable tab

tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); // tab name fill parent

viewPager = (ViewPager) x.findViewById(R.id.viewpager);

mFragmentArrayList = new ArrayList<>();

mFragmentArrayList.add(new TabFragmentModelClass(new MyNewsSelectionFragment(), "", ""));

mFragmentArrayList.add(new TabFragmentModelClass(mMyNewsFragment, "", getResources().getString(R.string.mynews)));

mFragmentArrayList.add(new TabFragmentModelClass(new BreakingNewsFragment(), "", getResources().getString(R.string.breakingnews)));

// Selected news from shared preference

ArrayList tempSharedPreferenceModelClass = new MyNewsSharedPreferenceClass().loadFavorites(getActivity());

for (int i = 0; i < tempSharedPreferenceModelClass.size(); i++) {

mFragmentArrayList.add(new TabFragmentModelClass(new CategoreyNewsFragment(tempSharedPreferenceModelClass.get(i).getmCatID()), tempSharedPreferenceModelClass.get(i).getmCatID(),

tempSharedPreferenceModelClass.get(i).getmCatName()));

}

}

/**

*Set an Apater for the View Pager

*/

mTabLayoutAdapter = new TabLayoutAdapter(getChildFragmentManager(), mFragmentArrayList);

viewPager.setAdapter(mTabLayoutAdapter);

viewPager.setOffscreenPageLimit(mFragmentArrayList.size());

tabLayout.setupWithViewPager(viewPager);

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override

public void onPageSelected(int position) {

tabLayout.getTabAt(position);

}

@Override

public void onPageScrollStateChanged(int state) {

if (state == 1) {

updateMyNewsFragment();

}

}

});

/**

* Now , this is a workaround ,

* The setupWithViewPager dose't works without the runnable .

* Maybe a Support Library Bug .

*/

tabLayout.post(new Runnable() {

@Override

public void run() {

tabLayout.getTabAt(0).setIcon(R.mipmap.mynewselection);

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

viewPager.setCurrentItem(tab.getPosition());

switch (tab.getPosition()) {

case 1:

System.out.println("000000000000000000000 ");

updateMyNewsFragment();

break;

}

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

}

});

return x;

}

/**

* update the mynews selection

* this method trigger from the MainNewsActivity

*/

public void updateMyNewsFragment() {

if (ApplicationController.getInstance().getBoolPref(CommonVariableInterFace.isNewsSelected)) {

mMyNewsFragment.sendMyNewsRequest();

ApplicationController.getInstance().setBoolPref(CommonVariableInterFace.isNewsSelected, false);

}

}

/**

* update the tab values

* this method trigger from the MainNewsActivity

* if value is zero need to add in tab

* if value is one need to remove in tab

*/

public void updateTabvalue(String catId, String catName, int value) {

if (value == 0) { // add the value in tab

mFragmentArrayList.add(new TabFragmentModelClass(new CategoreyNewsFragment(catId), catId,

catName));

} else { // Removing the tab

for (int i = 0; i < mFragmentArrayList.size(); i++) {

if (mFragmentArrayList.get(i).getmCatID().equalsIgnoreCase(catId)) {

Log.i("-----same id ", catId);

mFragmentArrayList.remove(i);

mTabLayoutAdapter = new TabLayoutAdapter(getChildFragmentManager(), mFragmentArrayList);

viewPager.setAdapter(mTabLayoutAdapter);

}

}

}

mTabLayoutAdapter.notifyDataSetChanged();

viewPager.setOffscreenPageLimit(mFragmentArrayList.size());

tabLayout.getTabAt(0).setIcon(R.mipmap.mynewselection);

tabLayout.setupWithViewPager(viewPager);

tabLayout.post(new Runnable() {

@Override

public void run() {

tabLayout.getTabAt(0).setIcon(R.mipmap.mynewselection);

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {

@Override

public void onTabSelected(TabLayout.Tab tab) {

viewPager.setCurrentItem(tab.getPosition());

switch (tab.getPosition()) {

case 1:

updateMyNewsFragment();

break;

}

}

@Override

public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

public void onTabReselected(TabLayout.Tab tab) {

}

});

}

});

}

public void openSpecificTab() {

// tabLayout.settab

// tabLayout.se

}

}

适配器代码:

public class TabLayoutAdapter extends FragmentPagerAdapter {

private long baseId = 0;

ArrayList fragmentAdapterArrayList;

public TabLayoutAdapter(FragmentManager fm, ArrayList fragmentArrayList) {

super(fm);

fragmentAdapterArrayList = fragmentArrayList;

}

@Override

public Fragment getItem(int position) {

if (position == 0)

return fragmentAdapterArrayList.get(position).getmFragment();

if (position == 1)

return fragmentAdapterArrayList.get(position).getmFragment();

if (position == 2)

return fragmentAdapterArrayList.get(position).getmFragment();

return new CategoreyNewsFragment().newInstance(fragmentAdapterArrayList.get(position).getmCatID());

}

@Override

public int getCount() {

return fragmentAdapterArrayList.size();

}

//this is called when notifyDataSetChanged() is called

@Override

public int getItemPosition(Object object) {

// refresh all fragments when data set changed

return TabLayoutAdapter.POSITION_NONE;

}

@Override

public long getItemId(int position) {

// give an ID different from position when position has been changed

return baseId + position;

}

/**

* Notify that the position of a fragment has been changed.

* Create a new ID for each position to force recreation of the fragment

*

* @param n number of items which have been changed

*/

public void notifyChangeInPosition(int n) {

// shift the ID returned by getItemId outside the range of all previous fragments

baseId += getCount() + n;

}

/**

* // * This method returns the title of the tab according to the position.

* //

*/

@Override

public CharSequence getPageTitle(int position) {

return fragmentAdapterArrayList.get(position).getmCatName();

}

}

2015-12-16

Ruban

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐