全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android用RecyclerView实现动态添加本地图片

本文介绍了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 


相关文章: 魔毅自助建站系统:模板定制与SEO优化一键生成指南  ,南京靠谱的征婚网站?  如何快速搭建高效服务器建站系统?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在阿里云虚拟服务器快速搭建网站?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  北京网站制作公司哪家好一点,北京租房网站有哪些?  建站之星各版本价格是多少?  香港服务器选型指南:免备案配置与高效建站方案解析  Android使用GridView实现日历的简单功能  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  太平洋网站制作公司,网络用语太平洋是什么意思?  c# await 一个已经完成的Task会发生什么  ,有什么在线背英语单词效率比较高的网站?  如何快速搭建FTP站点实现文件共享?  如何做网站制作流程,*游戏网站怎么搭建?  浅谈Javascript中的Label语句  nginx修改上传文件大小限制的方法  建站VPS推荐:2025年高性能服务器配置指南  如何通过VPS建站实现广告与增值服务盈利?  名字制作网站免费,所有小说网站的名字?  网站制作公司排行榜,抖音怎样做个人官方网站  历史网站制作软件,华为如何找回被删除的网站?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  Android自定义控件实现温度旋转按钮效果  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  设计网站制作公司有哪些,制作网页教程?  教程网站设计制作软件,怎么创建自己的一个网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  C++时间戳转换成日期时间的步骤和示例代码  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  建站之星如何助力企业快速打造五合一网站?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  建站主机是否等同于虚拟主机?  建站之星北京办公室:智能建站系统与小程序生成方案解析  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  非常酷的网站设计制作软件,酷培ai教育官方网站?  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  购物网站制作公司有哪些,哪个购物网站比较好?  定制建站是什么?如何实现个性化需求?  宿州网站制作公司兴策,安徽省低保查询网站?  黑客如何通过漏洞一步步攻陷网站服务器?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网页设计与网站制作内容,怎样注册网站?  香港网站服务器数量如何影响SEO优化效果?  如何续费美橙建站之星域名及服务?  如何在建站之星绑定自定义域名? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。