在我的项目中,我有一个选项卡布局和一个片段viewpager。当我加载片段和选项卡时,选项卡索引和显示的片段不同步,并且当我前后滑动时,片段与选项卡不同步。我检查了getItem(int position)
和getTitle(int position)
方法都具有相同的位置编号,并且ArrayList<Fragments>
和ArrayList<String>
(用于标签标题)中的相应条目正确,但是标签显示方式与视图寻呼机。
这是我的fragmentPagerAdapter.java
public class DetailsFragmentPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> fragments;
private ArrayList<String> titles;
public DetailsFragmentPagerAdapter(FragmentManager fm) {
super(fm);
fragments = new ArrayList<>();
titles = new ArrayList<>();
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return titles.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
public void setFragment(Fragment fragment, String title) {
fragments.add(fragment);
titles.add(title);
notifyDataSetChanged();
}
}
这是创建时的活动。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details);
tabLayout = (TabLayout) findViewById(R.id.detailsTabs);
viewPager = (ViewPager) findViewById(R.id.viewPager);
new GetCategoriesAsync2().execute();
}
异步任务的doInBackground调用正在准备arraylist
和onPostExecute
@Override
protected void onPostExecute(Void aVoid) {
int size = lists.size();
ArrayList<Fragment> fragments = new ArrayList<>(size);
ArrayList<String> titles = new ArrayList<>(size);
for (int i = 0; i < lists.size(); i++) {
ArrayList<String> x = lists.get(i);
titles.add(x.remove(0));
fragments.add(DetailsListFragment.newInstance(x));
}
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentPagerAdapter = new DetailsFragmentPagerAdapter(fragmentManager);
fragmentPagerAdapter.setFragments(fragments,titles);
viewPager.setAdapter(fragmentPagerAdapter);
tabLayout.setupWithViewPager(viewPager);
progressDialog.dismiss();
}
我正在使用设计支持库23.0.1,构建目标是23。
如何解决此标签布局不同步的问题?
最佳答案
如果使用TabLayout,则需要将其连接到适配器
如果将ViewPager
与该布局一起使用,则可以使用
setTabsFromPagerAdapter(PagerAdapter)
将会填充标签
使用给定的PagerAdapter的页面标题。您还应该使用
TabLayout.TabLayoutOnPageChangeListener
向前滚动并
选择将更改为这种布局,如下所示:
ViewPager viewPager = ...;
TabLayout tabLayout = ...;
viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(tabLayout));