Android用RecyclerView实现动态添加本地图片
时间:2022-07-28
本文章向大家介绍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可以直接更新有变化的子项,而不用更新全部子项,用户体验更好,性能也提高了。
以上就是本文的全部内容,希望对大家的学习有所帮助。
- WCF后续之旅(7):通过WCF Extension实现和Enterprise Library Unity Container的集成
- 区块链技术(一):Truffle开发入门
- Nodejs学习笔记(一)——初识Nodejs
- RabbitMQ入门-Topic模式
- 单分子数据储存取得一大突破,一枚“硬币”存量相当于100部iPhone 7
- Windows 7 旗舰版 VHD安装体验
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
- 不规则图形的碰撞检测
- 自学WP7第一个例子:时钟
- 教您最简单粗暴的MATLAB入门级爬虫2
- 前台JS(Jquery)调用后台方法 无刷新级联菜单示例
- 项目中对图片的缩放和水印效果
- 照虎画猫写自己的Spring——自定义注解
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
- tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
- PHP基于cookie实现统计在线人数功能示例
- PHP实现对数字分隔加千分号的方法
- PHP验证类的封装与使用方法详解
- Laravel框架实现的rbac权限管理操作示例
- Laravel框架实现的批量删除功能示例
- PyTorch中model.zero_grad()和optimizer.zero_grad()用法
- 利用PyTorch实现VGG16教程
- PHP添加文字水印或图片水印的水印类完整源代码与使用示例
- Python 分布式缓存之Reids数据类型操作详解
- Pycharm打开已有项目配置python环境的方法
- python cv2.resize函数high和width注意事项说明
- pytorch SENet实现案例
- python如何安装下载后的模块