在我的项目中,我有一个选项卡布局和一个片段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));

07-24 09:49
查看更多