You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ViewPager.setCurrentItem返回错误位置问题求助

解决ViewPager.setCurrentItem跳转错误位置的问题

我先帮你排查下这个问题的常见原因和对应的解决办法:

一、最容易踩坑的原因:TabLayout和ViewPager未正确绑定

你现在是手动在Tab选中事件里调用setCurrentItem,但官方其实更推荐让TabLayout和ViewPager双向自动绑定,系统会自动同步两者的位置,完全避免手动设置导致的错位问题。

你可以直接删掉当前的addOnTabSelectedListener代码,换成下面的绑定逻辑:

// 让TabLayout和ViewPager自动关联,双向同步位置
mTabLayoutBerita.setupWithViewPager(mViewPagerBerita);

绑定后,点击Tab会自动切换ViewPager页面,ViewPager滑动也会同步选中对应的Tab,不需要再手动处理选中事件,这大概率能解决你的位置错位问题。

二、如果必须保留手动监听(有自定义需求)

要是你因为自定义逻辑必须保留OnTabSelectedListener,那要注意这几个细节:

  • 确保你的PagerBerita适配器里的getCount()返回的页面数量,和TabLayout的Tab数量完全一致,这是最容易忽略的点!
  • 检查是否在其他代码位置也调用了setCurrentItem,导致多次触发位置变更产生冲突
  • 可以尝试关闭平滑滚动再调用setCurrentItem,避免动画延迟导致的视觉错位:
// false表示直接跳转,不播放滚动动画
mViewPagerBerita.setCurrentItem(tab.getPosition(), false);

三、适配器的潜在问题

从你给出的PagerBerita片段来看,要确保适配器的核心逻辑正确:

  • getItem()方法返回的Fragment实例没有复用错误
  • getPageTitle()返回的标题和TabLayout的Tab文本一一对应,避免Tab和页面不匹配

给你一个完整的FragmentPagerAdapter参考示例:

public class PagerBerita extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    // 推荐用这个构造参数,优化Fragment的生命周期管理
    public PagerBerita(FragmentManager fm) {
        super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
    }

    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

设置适配器时,记得添加和Tab数量一致的Fragment:

PagerBerita adapter = new PagerBerita(getSupportFragmentManager());
adapter.addFragment(new TerbaruFragment(), "最新");
adapter.addFragment(new PopulerFragment(), "热门");
// 按Tab数量添加对应Fragment
mViewPagerBerita.setAdapter(adapter);
mTabLayoutBerita.setupWithViewPager(mViewPagerBerita);

四、其他排查方向

  • 检查是否给TabLayout设置了自定义Tab样式,比如自定义View导致位置计算错误
  • 如果是用ViewPager2(现在官方推荐使用),绑定方式是TabLayoutMediator,不过你的代码是ViewPager,这条可以忽略

先试试自动绑定的方法,应该能解决大部分错位问题,如果还有问题再排查适配器和其他逻辑~

内容的提问来源于stack exchange,提问作者Viko Wijaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:16:46