【问题标题】:ViewPager Not Synched with TabLayoutViewPager 未与 TabLayout 同步
【发布时间】:2017-03-06 22:54:27
【问题描述】:

我有一个显示第 n 个项目的 ViewPager 和 Tablayout。 Tabs 填充了正确的页面标题,并且 ViewPager 包含的 Fragments 显示正确的罚款,除了所选的 Tab 未与 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 项左右滚动的日志

【问题讨论】:

  • 在视图寻呼机中检查您的数据
  • 数据显示正确,两者都引用同一个ArrayList
  • 我认为列表数据不正确.. 否则一切正常
  • 谢谢,我刚刚再次验证,数据非常正确。选项卡布局位置在 Viewpager 后面。
  • 请发布您的数据字符串。

标签: android android-fragments android-viewpager android-tabhost


【解决方案1】:

您可以在片段中使用静态变量,而不是使用, 片段中的公共函数,如下所示。

添加

    @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;
  }  

【讨论】:

  • 谢谢,我去掉了静态Fragment工厂方法,还是一样的体验。我认为 getItem 是导致问题的原因。我添加了getitem日志的截图
  • 您附加的图片使您的问题不清楚。你能详细说明一下吗?
  • 当我创建 Viewpager 时,getItem 以位置 1 和 0 调用。如果我向右滑动,它会转到位置 2,然后是 3、4 到 10。如果向右滑动,它会从位置 10 开始t0 8.
【解决方案2】:

最后,这就是我将 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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多