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
相关产品推荐
相关产品推荐

