本文所用的多图选择的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));}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {view = LayoutInflater.from(mContext).inflate(R.layout.lay_passager, null);viewHolder = new ViewHolder(view);return viewHolder;}@Overridepublic 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转化成drawableBitmap 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);}}}@Overridepublic 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() {@Overridepublic void onClick(View v) {int position = (Integer) v.getTag();listener.onBigClick(getPosition());}});imageViewSmall.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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-->修改//修改图片,更新视图}}@Overridepublic void onSmallClick(int position) {imageUrls.remove(position);passengerAdapter.notifyItemRemoved(position);//删除图片,更新视图}});

选择完图片后,进行ui更新的操作

  /*** 返回图片url,并上传七牛** @param requestCode* @param resultCode* @param data*/@Overrideprotected 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可以直接更新有变化的子项,而不用更新全部子项,用户体验更好,性能也提高了。
好了,今天就这样了。
—2016-07-15

用RecyclerView实现动态添加本地图片相关推荐

  1. android 点动态显示图片,Android用RecyclerView实现动态添加本地图片

    本文介绍了Android用RecyclerView实现动态添加本地图片,分享给大家,具体如下: 简单介绍一下用法: 1.跳转到图片选择页面: Intent intent = new Intent(Pa ...

  2. [Android] 通过GridView仿微信动态添加本地图片

    原文:http://blog.csdn.net/eastmount/article/details/41808179 前面文章讲述的都是"随手拍"中图像处理的操作,此篇文章主要讲述 ...

  3. android仿微信发布动态功能,Android GridView扩展仿微信微博发图动态添加删除图片功能.pdf...

    Android GridView扩扩展展仿仿微微信信微微博博发发图图动动态态添添加加删删除除图图片片功功能能 这篇文章主要为大家详细介绍了Android GridView扩展仿微信微博发图动态添加删除 ...

  4. vue如何动态渲染本地图片img

    动态渲染本地图片 <div class="wrap_left" v-for="item of array" :key="item.id" ...

  5. 百度地图自定义图标icon 添加本地图片无法显示问题解决

    百度地图自定义图标icon 添加本地图片无法显示问题解决 我们在阿里巴巴矢量库找的icon 保存到本地 结论 我们在阿里巴巴矢量库找的icon 保存到本地 链接: 阿里巴巴矢量库. 图片: 随便找一个 ...

  6. 【微信小程序-原生开发】实用教程05-首页(含自定义调试模式、插入图片、图文排版、底部留白、添加本地图片)

    开始前,请先完成启动/欢迎/首屏广告页的开发,详见 [微信小程序-原生开发]实用教程04-启动/欢迎/首屏广告页(含倒计时.添加文字.rpx.定义变量和函数.读取变量.修改变量.wx.reLaunch ...

  7. css行内样式动态添加背景图片及样式

    有时候需要循环动态添加背景图片,可以采用以下方法,重点是url后面别忘了加'+' <divclass="right_item":style="{'backgroun ...

  8. 【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐

    这篇文章,主要介绍PDFBox操作PDF文档之添加本地图片.添加网络图片.图片宽高自适应.图片水平垂直居中对齐. 目录 一.PDFBox操作图片 1.1.添加本地图片 (1)案例代码 (2)运行效果 ...

  9. mapBox添加本地图片

    说在前面 相比较于leaflet,mapbox现在已经日益强大,他提供了很多应用的例子给我们,但是总会有些不能照顾到所有人的实际需求,所以今天来介绍一些mapbox加载本地图片的例子. 开门见山 &l ...

最新文章

  1. 清华硕士爆料:这些才是机器学习必备的数学基础
  2. C#事件(event)解析
  3. 零基础Java学习之final关键字
  4. ​赠书:面向对象的两大迷思,再给你们解答一次
  5. Go并发编程中的那些事[译]
  6. jQuery选择器 (详解)
  7. EPC Class0 Gen1标签识别代码C++
  8. Hadoop HDFS (3) JAVA訪问HDFS
  9. loadrunner性能测试——第一步 录制脚本(中文版)
  10. Linux内核开发_2_Initramf
  11. 运动会管理系统(JAVA,JSP,SERVLET,MYSQL)
  12. 【深入理解Nginx】Nginx的配置
  13. 单变量分析、组合变量分析
  14. 苹果耳机无线真假测试软件,苹果耳机“真伪”终极鉴别来了,原来,区别如此大!...
  15. 退出登录如何清除token
  16. mac 误删引导分区
  17. ORACLE导出表数据-dmp文件
  18. 使用vsftpd 搭建ftp 服务器
  19. 笔记本和linux台式共享网络,怎么把笔记本的网络共享给台式电脑
  20. 金融风控实战入门-特征工程

热门文章

  1. 用java 编写的,让你的个人电脑主机成为http服务器,用浏览器作为客户端,浏览此主机的全部目录和文件
  2. 417. 太平洋大西洋水流问题(DFS)
  3. 备份文件系统中的文件到磁带库中(四)
  4. 用Python画国旗
  5. Linux学习笔记之软件安装
  6. Vue 登录密码验证 MD5加密
  7. 无锡计算机编程表演赛2021,“云动迎新春 欢乐满锡城” 无锡市2021新春全民健身线上运动会即将上线!...
  8. 12月钓鱼网站简报:新网数码占比超52% 涨幅明显
  9. 【module】subprocess
  10. 太空帝国5 Space Empires V SE5 攻略