Android用RecyclerView实现动态添加本地图片
发布时间 - 2026-01-11 02:42:24 点击率:次本文介绍了Android用RecyclerView实现动态添加本地图片,分享给大家,具体如下:

本文所用的多图选择的library来自:https://github.com/lovetuzitong/MultiImageSelector
简单介绍一下用法:
1、跳转到图片选择页面:
Intent intent = new Intent(PassengerSetActivity.this, MultiImageSelectorActivity.class);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 9);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE);
startActivityForResult(intent, 10001);//10001-->添加
2、通过onActivityResult获取信息:
final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT); Bitmap bitmap = BitmapFactory.decodeFile(paths.get(0), DIY_dialog.getBitmapOption(4));
首先设置布局管理器为:
recyclerview.setLayoutManager(new GridLayoutManager(this, 3));
然后设置适配器(这里在代码里面有详细的注释):
public class PassengerAdapter extends RecyclerView.Adapter<PassengerAdapter.ViewHolder> {
private Context mContext;
private OnItemClickLitener listener;//点击事件接口
private ArrayList<String> imageUrls;
private ImageFetcher imageFetcher;
private ViewHolder viewHolder;
private View view;
/**
* 在构造方法中传入图片地址的数据
* @param context
* @param imageUrls
*/
public PassengerAdapter(Context context, ArrayList<String> imageUrls) {
this.mContext = context;
this.imageUrls = imageUrls;
//初始化加载网络图片的jar包
imageFetcher = new ImageFetcher(context);
imageFetcher.setImageCache(ImageCache.getInstance(context));
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
view = LayoutInflater.from(mContext).inflate(R.layout.lay_passager, null);
viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
//设置内容为“hehe”的的元素为默认的添加按钮
if (imageUrls.get(position).equals("hehe")) {
holder.imageViewBig.setBackgroundResource(R.mipmap.add);
//当图片是添加按钮的时候隐藏删除按钮
holder.imageViewSmall.setVisibility(View.GONE);
} else {
holder.imageViewSmall.setVisibility(View.VISIBLE);
/**
* 判断图片路径是网络地址还是本地图片
* 设置路径之中包含“storage”的为本地图片
*/
if (imageUrls.get(position).contains("storage")) {
try {
File file = new File(imageUrls.get(position));
//将bitmap转化成drawable
Bitmap bmp = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(), Uri.fromFile(file));
Drawable drawable =new BitmapDrawable(bmp);
//按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
holder.imageViewBig.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.imageViewBig.setImageBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
// holder.imageViewBig.setImageURI(Uri.parse(imageUrls.get(position)));
} else {
imageFetcher.loadImage(imageUrls.get(position), holder.imageViewBig, R.mipmap.touxiang);
}
}
}
@Override
public int getItemCount() {
return imageUrls.size();
}
public void setOnItemClickLitener(OnItemClickLitener listener) {
this.listener = listener;
}
public interface OnItemClickLitener {
void onBigClick(int position);
void onSmallClick(int position);
}
class ViewHolder extends RecyclerView.ViewHolder {
ImageView imageViewBig, imageViewSmall;
public ViewHolder(View itemView) {
super(itemView);
imageViewBig = (ImageView) itemView.findViewById(R.id.imageViewBig);
imageViewSmall = (ImageView) itemView.findViewById(R.id.imageViewSmall);
/**
*
* 因为元素是变化的,动态的,所以对点击事件的处理放在ViewHolder类里面,调用getposition()
* 可以获取到当前的元素位子
*/
imageViewBig.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
listener.onBigClick(getPosition());
}
});
imageViewSmall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = (Integer) v.getTag();
listener.onSmallClick(getPosition());
}
});
}
}
}
recycler的布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/lay_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageViewBig"
android:layout_width="120dp"
android:layout_height="120dp"
android:background="@mipmap/background"
/>
<ImageView
android:id="@+id/imageViewSmall"
android:layout_width="20dp"
android:layout_height="20dp"
android:background="@mipmap/del"
android:layout_gravity="right"/>
</FrameLayout>
</FrameLayout>
配置recyclerview和设置点击事件
recyclerview = (RecyclerView) findViewById(R.id.recyclerview);
recyclerview.setLayoutManager(new GridLayoutManager(this, 3));
if(imageUrls.size()==0){
imageUrls.add("hehe");
}
passengerAdapter = new PassengerAdapter(this, imageUrls);
recyclerview.setAdapter(passengerAdapter);
passengerAdapter.setOnItemClickLitener(new PassengerAdapter.OnItemClickLitener() {
@Override
public void onBigClick(int position) {
Log.d(TAG, "onBigClick: "+passengerAdapter.getItemCount());
Log.d(TAG, "onBigClick: "+position);
if (position==imageUrls.size()-1) {
//添加本地相册图片,更新视图
Intent intent = new Intent(PassengerSetActivity.this, MultiImageSelectorActivity.class);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 9);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE);
startActivityForResult(intent, 10001);//10001-->添加
} else {
Intent intent = new Intent(PassengerSetActivity.this, MultiImageSelectorActivity.class);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SHOW_CAMERA, true);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_COUNT, 9);
intent.putExtra(MultiImageSelectorActivity.EXTRA_SELECT_MODE, MultiImageSelectorActivity.MODE_SINGLE);
poss = position;
startActivityForResult(intent, 10002);//10002-->修改
//修改图片,更新视图
}
}
@Override
public void onSmallClick(int position) {
imageUrls.remove(position);
passengerAdapter.notifyItemRemoved(position);
//删除图片,更新视图
}
});
选择完图片后,进行ui更新的操作
/**
* 返回图片url,并上传七牛
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data!=null){
if (requestCode == 10001 || requestCode == 10002) {
final ArrayList<String> paths = data.getStringArrayListExtra(MultiImageSelectorActivity.EXTRA_RESULT);
Bitmap bitmap = BitmapFactory.decodeFile(paths.get(0), DIY_dialog.getBitmapOption(4));
//添加图片
if (requestCode == 10001) {
//将添加的图片放在第一位
imageUrls.add(0,paths.get(0));
//更新第一个位置的图片
passengerAdapter.notifyItemInserted(0);
}
//修改图片
else if (requestCode == 10002&&imageUrls.size()>0) {
int pos = poss;
imageUrls.set(pos,paths.get(0));
passengerAdapter.notifyItemChanged(pos);
}
}
}
}
大概就是这样了,简单的说一下思路,就是在存储图片的list的最后一项添加一个具有不同标识的数据,当点击时对应的标识和该标识一致,则添加,反之为修改。使用recylerview可以直接更新有变化的子项,而不用更新全部子项,用户体验更好,性能也提高了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# 动态添加图片
# RecyclerView动态添加图片
# Android实现动态改变shape.xml中图形的颜色
# Android 拍照选择图片并上传功能的实现思路(包含权限动态获取)
# Android动态修改应用图标与名称的方法实例
# Android绘制动态折线图
# Android GridView扩展仿微信微博发图动态添加删除图片功能
# Android动态绘制饼状图的示例代码
# Android将Glide动态加载不同大小的图片切圆角与圆形的方法
# Android 动态加载二维码视图生成快照的示例
# Android实现动态改变app图标的示例代码
# Android自定义view实现动态柱状图
# Android如何实现动态滚动波形图(心电图)功能
# 放在
# 的说
# 给大家
# 可以直接
# 管理器
# 多图
# 介绍一下
# 以对
# 大家多多
# 转化成
# 跳转到
# 按比例
# 网络地址
# 提高了
# 加载
# 上传
# 就是在
# view
# param
# viewHolder
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Fortify是什么,和Jetstream有什么关系
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
如何在香港免费服务器上快速搭建网站?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
奇安信“盘古石”团队突破 iOS 26.1 提权
如何撰写建站申请书?关键要点有哪些?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
如何续费美橙建站之星域名及服务?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何生成腾讯云建站专用兑换码?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
JavaScript如何实现继承_有哪些常用方法
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
,网页ppt怎么弄成自己的ppt?
Claude怎样写约束型提示词_Claude约束提示词写法【教程】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
如何用免费手机建站系统零基础打造专业网站?
如何在万网自助建站中设置域名及备案?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
phpredis提高消息队列的实时性方法(推荐)
如何快速搭建高效WAP手机网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Laravel怎么上传文件_Laravel图片上传及存储配置
googleplay官方入口在哪里_Google Play官方商店快速入口指南
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
如何在建站之星网店版论坛获取技术支持?
如何在云服务器上快速搭建个人网站?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
Laravel如何处理文件下载请求?(Response示例)
深入理解Android中的xmlns:tools属性
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
Laravel如何实现用户注册和登录?(Auth脚手架指南)
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Python3.6正式版新特性预览
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
如何在云主机上快速搭建多站点网站?

