本文介绍了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 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 {  private Context mContext;  private OnItemClickLitener listener;//点击事件接口  private ArrayList imageUrls;  private ImageFetcher imageFetcher;  private ViewHolder viewHolder;  private View view;  /**   * 在构造方法中传入图片地址的数据   * @param context   * @param imageUrls   */  public PassengerAdapter(Context context, ArrayList 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"?>            

配置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 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可以直接更新有变化的子项,而不用更新全部子项,用户体验更好,性能也提高了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多相关文章

  1. Android实现下拉放大图片松手自动反弹效果
  2. Android图片处理工具类
  3. ProgressBar自定义样式中的层叠图片显示问题
  4. Android(安卓)记事本-Demo
  5. Android示例应用:开源框架Glide的使用
  6. android 利用httpclient上传图片
  7. 主题:ListView(带图片)显示用法案例
  8. Android开发入门之网络通信(网络图片查看器)
  9. UIView的drawRect: 和 - (void)setNeedsDisplay 的一些理解

随机推荐

  1. Android 判断是否为模拟器
  2. android中访问 webView加载URL时的respon
  3. Android Studio 关于多个module引用同一j
  4. Lambda for Android
  5. Android学习笔记02
  6. android openGl录制音视频
  7. Android初级教程_监听EditText输入文字的
  8. android回到桌面的方法
  9. android 日期按钮实现
  10. android中填充界面布局的三种方式