【发布时间】:2016-10-26 05:06:12
【问题描述】:
我在每个选项卡片段中使用动态列表视图制作动态选项卡。问题是当我在两个连续选项卡之间切换时,会显示前一个选项卡的 xml,但是当我单击非连续选项卡时它工作正常。不知道问题出在哪里所以附上我的fragment类和HomeActivity`在这里输入代码。
public class HomeActivity2 extends AppCompatActivity {
public ViewPagerAdapter adapter;
private Toolbar toolbar;
private TabLayout tabLayout;
private NonSwipeableViewPager viewPager;
public ArrayList<String> mappingOfCategoryWithIndex = new ArrayList<>();
public ArrayList<MenuItem> allMenuItemsList = new ArrayList<MenuItem>();
ArrayList<MenuItemCategory> allMenuItemCategoryList = new ArrayList<MenuItemCategory>();
//Getters
public NonSwipeableViewPager getViewPager() {
return viewPager;
}
public ArrayList<String> getMappingOfCategoryWithIndex() {
return mappingOfCategoryWithIndex;
}
public ArrayList<MenuItem> getAllMenuItemsList() {
return allMenuItemsList;
}
public TabLayout getTabLayout() {
return tabLayout;
}
public ArrayList<MenuItemCategory> getAllMenuItemCategoryList() {return allMenuItemCategoryList;}
@Override
protected void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home2);
findViewById(R.id.tabs).bringToFront();
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Getting All Menu Items
GetAllMenuItems menuItemsReader = null;
try {
menuItemsReader = new GetAllMenuItems();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
allMenuItemsList = menuItemsReader.getMenuItemsList();
// Getting All Categories
GetAllMenuItemCategories menuItemsCategoriesReader = null;
try {
menuItemsCategoriesReader = new GetAllMenuItemCategories();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
allMenuItemCategoryList = menuItemsCategoriesReader.getCategoryList();
// toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
viewPager = (NonSwipeableViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
//THIS!!
if (viewPager != null) {
viewPager.setCurrentItem(tab.getPosition());
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
tabLayout.setupWithViewPager(viewPager);
setupTabIcons();
}
private void setupTabIcons() {
for (int i=0; i<allMenuItemCategoryList.size() ; i++){
TextView tab = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
tab.setText(allMenuItemCategoryList.get(i).Menu_Item_Category_Name);
mappingOfCategoryWithIndex.add(i, allMenuItemCategoryList.get(i).Menu_Item_Category_Name) ;
tabLayout.getTabAt(i).setCustomView(tab);
}
// int j = 0;
// for (int i=0; i<allMenuItemCategoryList.size() ; i++){
// TextView tab = (TextView) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
// if(i%2==0){
// tab.setText(allMenuItemCategoryList.get(j).Menu_Item_Category_Name);
// j++;
// }
// else{
// tab.setText("");
//
// }
// mappingOfCategoryWithIndex.add(i, allMenuItemCategoryList.get(i).Menu_Item_Category_Name) ;
// tabLayout.getTabAt(i).setCustomView(tab);
//
//
//
//// tab.setCompoundDrawablesWithIntrinsicBounds(0, drawable.ic_launcher, 0, 0);
//
//
//
// }
}
private void setupViewPager(ViewPager viewPager) {
adapter = new ViewPagerAdapter(getSupportFragmentManager());
for (int i=0 ; i<allMenuItemCategoryList.size() ; i++) {
adapter.addFrag(new TabCategory(), allMenuItemCategoryList.get(i).Menu_Item_Category_Name);
}
// int j=0;
// for (int i=0 ; i<allMenuItemCategoryList.size()*2 ; i++) {
// if (i % 2 == 0) {
// adapter.addFrag(new TabCategory(), allMenuItemCategoryList.get(j).Menu_Item_Category_Name);
// j++;
// }
// else{
// adapter.addFrag(new dummyClass(), "");
// }
// }
viewPager.setAdapter(adapter);
}
class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
// private final List<String> tabPositionCategory = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFrag(Fragment fragment, String title ) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
}
public class TabCategory extends Fragment{
private TextView nameOfItem;
HomeActivity2 activity;
public HomeActivity2.ViewPagerAdapter adapter;
private TabLayout tabLayout;
LinearLayout container1;
public ArrayList<String> mappingOfCategoryWithIndex = new ArrayList<>();
public ArrayList<MenuItem> allMenuItemsList1 = new ArrayList<MenuItem>();
public ArrayList<MenuItemCategory> allCategoryList1 = new ArrayList<MenuItemCategory>();
private NonSwipeableViewPager viewPager;
private String selectedCategory;
private int selectedCategoryId;
private ArrayList<MenuItem> menuItemsOfSelectedCategory = new ArrayList<>();
View rootView;
public TabCategory() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activity = (HomeActivity2) getActivity();
allMenuItemsList1 = activity.getAllMenuItemsList();
mappingOfCategoryWithIndex =activity.getMappingOfCategoryWithIndex();
tabLayout = activity.getTabLayout();
viewPager = activity.getViewPager();
viewPager.clearOnPageChangeListeners();
adapter = activity.adapter;
tabLayout.setupWithViewPager(viewPager);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
rootView = inflater.inflate(R.layout.tab_category, container, false);
menuItemsOfSelectedCategory.removeAll(menuItemsOfSelectedCategory);
menuItemsOfSelectedCategory.clear();
activity = (HomeActivity2) getActivity();
allMenuItemsList1 = activity.getAllMenuItemsList();
mappingOfCategoryWithIndex =activity.getMappingOfCategoryWithIndex();
tabLayout = activity.getTabLayout();
viewPager = activity.getViewPager();
adapter = activity.adapter;
allCategoryList1 = activity.getAllMenuItemCategoryList();
int tab_position=tabLayout.getSelectedTabPosition();
selectedCategory = adapter.getPageTitle(tab_position).toString();
System.out.println("Tab Category: " + selectedCategory );
for (int i = 0 ; i<allMenuItemsList1.size();i++){
if(allMenuItemsList1.get(i).getCategoryName().equals(selectedCategory)){
menuItemsOfSelectedCategory.add(allMenuItemsList1.get(i));
}
}
System.out.println("Size of Category Items: " + menuItemsOfSelectedCategory.size() );
nameOfItem = (TextView) rootView.findViewById(R.id.nameofitem);
System.out.println("Menu Size:"+ allMenuItemsList1.size());
return rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
container1 = (LinearLayout) rootView.findViewById(R.id.container1);
container1.removeAllViews();
for (int i =0 ; i<menuItemsOfSelectedCategory.size();i++) {
final View addView = layoutInflater.inflate(R.layout.menu_item, null);
nameOfItem = (TextView) addView.findViewById(R.id.nameofitem);
nameOfItem.setText(menuItemsOfSelectedCategory.get(i).getName());
container1.addView(addView);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
// not cleaning up.
menuItemsOfSelectedCategory.removeAll(menuItemsOfSelectedCategory);
menuItemsOfSelectedCategory.clear();
container1.removeAllViews();
container1.invalidate();
System.out.println("destroyed!!!");
}
}`
提前致谢。
【问题讨论】:
-
请添加完整的代码,以便我们重现问题。考虑MCVE question model。
-
需要注意的是,当一个ViewPager页面被选中时,被选中的页面和每边一个页面被加载(加载页面的数量可以使用setOffscreenPageLimit增加,最小为1 . 这就是为什么当您选择非连续页面时一切正常,因为所有计算都是从头开始使用此页面完成的,而当您选择相邻页面时,当前页面以及相邻页面执行相同的代码。
-
那么如何改正呢? setOffscreenPageLimit 为 0?
-
@MohanadMohie 我想你已经发现了问题,因为当我设置
setOffscreenPageLimit(2)时,会显示 2 个连续的上一页和下一页。这个问题有什么解决办法吗?我只想显示被选中的那个片段。 -
setOffscreenPageLimit的最小值可以为0,增加这个值并不能解决你的问题,因为你的问题是你用当前ViewPager的位置初始化Fragment,所以当Frag1被选中时(position = 0),ViewPager加载 Frag2,但仍带有position = 0。我必须在回家后的几个小时内检查问题出在哪里。
标签: android android-fragments tabs android-viewpager android-tablayout