Android Fragments ViewPager与TabLayout不同步

gmol1639  于 2022-12-13  发布在  Android
关注(0)|答案(2)|浏览(187)

我有一个ViewPager和Tablayout,显示第n个项目。标签填充了正确的页面标题,ViewPager包含的片段显示正确的罚款,除了选定的标签没有与ViewPager当前项目同步。
所选的Tab位置比Viewpager当前项的位置少1。这是Viewpager适配器。

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
        public ViewPagerAdapter(FragmentManager fm){
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Recipe selectedRecipe = getRecipeList().get(position);
            return RecipeDetailFragment.newInstance(selectedRecipe.getId);
        }

        @Override
        public int getCount() {
            return .getRecipeList().size();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            Recipe selectedRecipe = .getRecipeList().get(position);
            String title = selectedRecipe.getTitle();                
            return title ;
        }

        @Override
        public int getItemPosition(Object object) {
            return POSITION_NONE;
        }   

    }

下面是我如何设置ViewPager

private void setupViewPager() {
       ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

}
输出如下所示

**编辑1:**我认为问题与如何调用ViewPager的getItem方法有关,以下是10个项目的左右滚动日志

uelo1irk

uelo1irk1#

除了在片段中使用静态变量,您还可以在片段中使用如下所示的公共函数。
加了

@Override
    public Fragment getItem(int position) {
        Recipe selectedRecipe = getRecipeList().get(position);
        RecipeDetailFragment receiptFRagment= new ReceiptFragment();
        receiptFragment.setData(selectedRecipe.getId);
        return receiptFragment;
    }

而不是这样

@Override
    public Fragment getItem(int position) {
        Recipe selectedRecipe = getRecipeList().get(position);
        return RecipeDetailFragment.newInstance(selectedRecipe.getId);
    }

在片段中添加公共函数,

public void setData(int id){
   this.id= id;
  }
mdfafbf1

mdfafbf12#

最后,这是我如何同步ViewPager选定项与Tablayout选定选项卡。

void selectPage(final int pageIndex){
        new Handler().postDelayed(
                new Runnable() {
                    @Override public void run() {
                        tabLayout.setSmoothScrollingEnabled(true);
                        tabLayout.setScrollPosition(pageIndex, 0f, true);
                    }
                }, 100);
    }

然后,我从两个地方调用了此方法,第一个是在设置Viewpager时

recipePosition = getIntent().getIntExtra(Constants.RECIPE_POSITION, 0);
        ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);
        if (recipePosition > 0){
            recipePosition--;
        }
        viewPager.setCurrentItem(recipePosition,true);
        selectPage(recipePosition);

然后是setItem中的第二个

Recipe selectedRecipe = getRecipeList().get(position);
RecipeDetailFragment receiptFRagment= new ReceiptFragment();
receiptFragment.setData(selectedRecipe.getId);
selectPage(position);
return receiptFragment;

它的作品,我仍然不能理解为什么这些不是默认同步的!

相关问题