栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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;

  
  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);
      
      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);
      
      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的布局文件




  

    
    
  


配置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更新的操作

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/158174.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号