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

ViewPager初始化问题:点击Activity A列表项后Activity B无法显示对应详情

解决Activity B默认显示指定列表项详情的问题

嘿,我看了你的代码,问题出在两个核心点:一是你在ScreenSlidePagerAdapter的构造函数里手动添加Fragment到ViewPager,这会干扰ViewPager自身的Fragment管理逻辑;二是你没有根据从Activity A传递过来的ID定位到对应的position,导致ViewPager默认显示第一个项。

下面是具体的修复步骤:

1. 重构你的ScreenSlidePagerAdapter

首先要去掉构造函数里的Fragment事务和ID处理逻辑,让Adapter专注于根据position提供对应的Fragment:

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 
    Cursor data; 

    public ScreenSlidePagerAdapter(FragmentManager fm, Cursor data) { 
        super(fm); 
        this.data = data; 
        // 移除原来手动添加Fragment和设置ID的代码,交给ViewPager自行管理
    } 

    @Override 
    public Fragment getItem(int position) { 
        ArticleDetailUpdateFragment detailUpdateFragment = new ArticleDetailUpdateFragment(); 
        data.moveToPosition(position); 
        long id = data.getLong(data.getColumnIndex(ItemsContract.Items._ID)); 
        detailUpdateFragment.setId(id); 
        return detailUpdateFragment; 
    } 

    @Override 
    public int getCount() { 
        return data != null ? data.getCount() : 0; // 直接用Cursor的计数,避免pageCount变量可能的不一致
    } 
}

2. 在Activity B的onCreate中完成初始化和定位

你需要在Activity B的onCreate方法里完成三件事:获取传递的ID、找到对应position、设置ViewPager显示目标位置:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_b_layout);

    // 1. 获取从Activity A传递过来的目标item ID
    long targetId = getIntent().getLongExtra(ArticleListActivity.EXTRA_ITEM_ID, -1);
    if (targetId == -1) {
        // 处理ID无效的情况,比如关闭Activity或提示错误
        finish();
        return;
    }

    // 2. 假设你已获取到填充ViewPager的Cursor(比如从ContentProvider查询得到)
    Cursor data = ...; // 替换成你的Cursor获取逻辑
    ScreenSlidePagerAdapter adapter = new ScreenSlidePagerAdapter(getSupportFragmentManager(), data);
    ViewPager viewPager = findViewById(R.id.pager);
    viewPager.setAdapter(adapter);

    // 3. 遍历Cursor找到targetId对应的position
    int targetPosition = -1;
    if (data != null) {
        data.moveToFirst();
        while (!data.isAfterLast()) {
            long currentId = data.getLong(data.getColumnIndex(ItemsContract.Items._ID));
            if (currentId == targetId) {
                targetPosition = data.getPosition();
                break;
            }
            data.moveToNext();
        }
    }

    // 定位到目标position
    if (targetPosition != -1) {
        viewPager.setCurrentItem(targetPosition);
    }
}

为什么原来的代码不行?

  • 你在Adapter构造函数里手动调用beginTransaction().add(...),这会让ViewPager额外加载一个Fragment,和它自身管理的Fragment池冲突,导致默认显示第一个项。
  • 没有根据传递的ID去定位到对应的position,ViewPager默认会显示索引为0的项,所以不管点击哪个列表项,都只会展示第一个详情。

这样修改后,Activity B启动时就会直接跳转到你点击的那个列表项的详情页,同时左右滑动功能也能正常工作啦。

内容的提问来源于stack exchange,提问作者Louise L.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:56:20