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

Android RecyclerView传图至ViewPager触发Resources$NotFoundException求助

解决RecyclerView到ViewPager图片传递的Resources$NotFoundException问题

让我来帮你排查这个问题!你遇到的资源找不到异常,核心原因是ViewPager适配器中获取图片资源的方式错误,还有几个细节需要调整,咱们一步步来修正:

1. 核心错误:错误的Intent数据获取方式

在你的ViewPager适配器instantiateItem方法里,你新建了一个空的Intent intent = new Intent();,然后尝试从这个空Intent里拿数据——这肯定获取不到之前从RecyclerView传递过来的图片ID啊!正确的做法是从启动DetailsActivity的原始Intent中获取数据,而且你需要传递整个图片数组(而不是单个ID),因为ViewPager需要展示多页图片。

2. 分步修正代码

第一步:修改RecyclerView的点击事件,传递完整数据

在RecyclerView的ViewHolder点击方法里,把整个图片数组和当前点击的位置一起传递给DetailsActivity:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View view) {
    Intent intent = new Intent(context, DetailsActivity.class);
    intent.putExtra("slider_images", images); // 传递完整的图片资源ID数组
    intent.putExtra("current_position", getAdapterPosition()); // 传递当前点击的条目位置
    intent.putExtra("transition_name", ViewCompat.getTransitionName(iv));
    
    Pair<View,String> pair = Pair.create((View)iv, iv.getTransitionName());
    ActivityOptionsCompat compat = ActivityOptionsCompat.makeSceneTransitionAnimation ((Activity)context,pair);
    context.startActivity(intent,compat.toBundle());
}

第二步:在DetailsActivity中接收数据并初始化ViewPager

在DetailsActivity里先拿到传递过来的数组和位置,再把数据传给ViewPager适配器:

public class DetailsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_details);

        // 获取从RecyclerView传递过来的数据
        int[] images = getIntent().getIntArrayExtra("slider_images");
        int currentPosition = getIntent().getIntExtra("current_position", 0);

        // 初始化ViewPager和适配器
        ViewPager viewPager = findViewById(R.id.your_viewpager_id); // 替换成你实际的ViewPager ID
        YourPagerAdapter pagerAdapter = new YourPagerAdapter(this, images);
        viewPager.setAdapter(pagerAdapter);
        viewPager.setCurrentItem(currentPosition); // 直接跳转到点击的图片位置
    }
}

第三步:修正ViewPager适配器的逻辑

让适配器接收传递过来的图片数组,直接用数组中的资源ID设置图片,同时修复布局加载的小问题:

public class YourPagerAdapter extends PagerAdapter {
    private Context context;
    private int[] images;
    private LayoutInflater layoutInflater;

    // 构造方法接收图片数组
    public YourPagerAdapter(Context context, int[] images) {
        this.context = context;
        this.images = images;
        this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    // 必须重写这个方法,返回页面总数
    @Override
    public int getCount() {
        return images != null ? images.length : 0;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        // 布局加载时传入container,确保布局参数正确
        View view = layoutInflater.inflate(R.layout.custom_dots_layout, container, false);
        ImageView imageView = view.findViewById(R.id.detail_viewpager_image);
        
        // 直接从数组中取对应位置的资源ID设置图片
        imageView.setImageResource(images[position]);
        
        ViewPager viewPager = (ViewPager) container;
        viewPager.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        ViewPager viewPager = (ViewPager) container;
        View view = (View) object;
        viewPager.removeView(view);
    }
}

3. 额外检查点

除了代码修正,你还需要确认这几点:

  • 确保images数组里的所有int值都是有效的drawable资源ID,没有写错或者引用了已删除的资源;
  • 检查custom_dots_layout中的ImageView ID确实是detail_viewpager_image,没有拼写错误;
  • 确认DetailsActivity已经在AndroidManifest.xml中注册。

这样修改后,应该就能解决资源找不到的异常,同时实现点击RecyclerView条目跳转到ViewPager对应图片的功能了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:46:07