Android:从Drawable加载图片到ViewPager的实现咨询
搞定ViewPager页面ImageView加载Drawable图片的方案
嘿,我来帮你把这个需求落地!你已经有了ViewPager和三个页面布局的基础,接下来咱们一步步完成每个页面ImageView加载本地Drawable图片的逻辑:
1. 先准备好Drawable资源ID列表
首先,和你的布局列表对应,创建一个存放图片资源ID的列表:
private List<Integer> getIntroImageIds() { List<Integer> imageIds = new ArrayList<>(); imageIds.add(R.drawable.your_intro_img1); // 替换成你实际的第一张图片资源 imageIds.add(R.drawable.your_intro_img2); imageIds.add(R.drawable.your_intro_img3); return imageIds; }
2. 写一个自定义的PagerAdapter
因为你是用布局文件作为ViewPager的页面,咱们写个继承自PagerAdapter的自定义适配器,在创建页面的时候顺便给ImageView设置图片:
public class IntroPagerAdapter extends PagerAdapter { private Context mContext; private List<Integer> mLayoutIds; private List<Integer> mImageIds; // 构造方法传入上下文、布局列表和图片列表 public IntroPagerAdapter(Context context, List<Integer> layoutIds, List<Integer> imageIds) { mContext = context; mLayoutIds = layoutIds; mImageIds = imageIds; } @Override public int getCount() { return mLayoutIds.size(); // 返回页面总数 } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; // 判定View和Object是否对应 } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, int position) { // 加载对应位置的布局文件 LayoutInflater inflater = LayoutInflater.from(mContext); View pageView = inflater.inflate(mLayoutIds.get(position), container, false); // 找到布局里的ImageView(这里要注意:替换成你每个布局里ImageView的实际ID!) ImageView introImageView = pageView.findViewById(R.id.iv_intro_page); // 设置Drawable图片 introImageView.setImageResource(mImageIds.get(position)); container.addView(pageView); return pageView; } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View) object); // 销毁页面时移除View } }
3. 给ViewPager绑定适配器
回到你的Fragment里,在初始化ViewPager的地方,把布局列表和图片列表传给适配器,然后设置给ViewPager:
// 获取你已经写好的布局列表和刚创建的图片列表 List<Integer> pageLayouts = getIntroResourceIds(); List<Integer> pageImages = getIntroImageIds(); // 创建适配器并绑定到ViewPager IntroPagerAdapter introAdapter = new IntroPagerAdapter(getContext(), pageLayouts, pageImages); mViewPager.setAdapter(introAdapter);
一些额外的小提示
- 如果你的每个页面里的ImageView ID不一样,那可以再做一个ImageView ID的列表,在
instantiateItem里根据position取对应的ID来findViewById。 - 要是你的图片比较大,建议用Glide这类图片加载库来加载,能避免内存溢出问题,代码大概是这样:
// 替换setImageResource那行代码 Glide.with(mContext) .load(mImageIds.get(position)) .into(introImageView); - 如果你用了Data Binding,那可以用DataBindingUtil来加载布局,直接通过绑定对象设置图片,代码会更简洁~
内容的提问来源于stack exchange,提问作者Anh Vinh Huỳnh
相关产品推荐
相关产品推荐

