概述

上一篇文章介绍了Loader的作用和相关知识,说白了Loader就是Android提供给我们用来更容易查询数据用的。其实在我们应用中查询数据最常用的应该就是查询手机的图片进行显示。今天就来学习一下使用Loader做一个简单的本地图片库,类似于微信的图片选择。先来看看效果图:

福利来了!

由于图片上传大小有限制,所以只有一点效果,大家可以在最后下载源码自己体验,就算快速滑动也马上就能显示。
对Loader还没有了解的同学可以去看上一篇文章: Android Loader解析

要做一个这样的图片浏览其实很简单,利用Loader把手机里所有图片查询出来,再使用GridView进行展示就行了。就是那么简单。

实现步骤

1、建一个用来查询和展示图片的Activity,在onCreate中初始化Loader,并且在回调LoaderCallbacks的回调方法中进行处理。

public class ImageGridActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {private final String[] IMAGE_PROJECTION = {MediaStore.Images.Media.DATA,MediaStore.Images.Media.DISPLAY_NAME,MediaStore.Images.Media.DATE_ADDED,MediaStore.Images.Media._ID };// different loader definepublic static final int LOADER_ALL = 0;public static final int LOADER_CATEGORY = 1;private ArrayList<ImageSet> mImageSetList = new ArrayList<>();int imageGridSize;GridView mGridView;//进行图片展示的GridViewImageGridAdapter mAdapter;//图片展示的Adapter@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_image_grid);imageGridSize = (getWindowManager().getDefaultDisplay().getWidth() - Util.dp2px(this, 2) * 2) / 3;//根据屏幕宽度获取到item显示的大小mGridView = (GridView) findViewById(R.id.image_grid);getLoaderManager().initLoader(0,null,this);//初始化Loader,LoaderManager会回调onCreateLoader去获取一个Loader,并且在查询结束的时候回调onLoadFinished}@Overridepublic Loader<Cursor> onCreateLoader(int i, Bundle bundle) {//创建了一个CursorLoader,查询的数据有文件地址,名次,添加时间,id并且按照添加时间排序CursorLoader cursorLoader =  new CursorLoader(this, MediaStore.Images.Media.EXTERNAL_CONTENT_URI,IMAGE_PROJECTION,null,null,IMAGE_PROJECTION[2]+" DESC ");return cursorLoader;}@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {//获取到查询的所有图片信息,并且设置到adapter总进行图片显示if (data!=null){List<ImageItem> allImages = new ArrayList<>();int count = data.getCount();if (count <= 0){return;}data.moveToFirst();do {String imagePath = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[0]));String imageName = data.getString(data.getColumnIndexOrThrow(IMAGE_PROJECTION[1]));long imageAddedTime = data.getLong(data.getColumnIndexOrThrow(IMAGE_PROJECTION[2]));ImageItem item = new ImageItem(imagePath,imageName,imageAddedTime);allImages.add(item);}while (data.moveToNext());mAdapter = new ImageGridAdapter(this,allImages);mGridView.setAdapter(mAdapter);}}@Overridepublic void onLoaderReset(Loader<Cursor> loader) {}}

上面代码都给了注释,很好理解。在onLoadFinished中查询到图片信息,并且将图片信息封装到ImageItem实体类中。添加到List。最后简单设置一下数据适配器

2、查询到图片信息之后,就是需要显示出来,接下来看一下适配器的代码:

class ImageGridAdapter extends BaseAdapter {List<ImageItem> images;Context mContext;public ImageGridAdapter(Context ctx, List<ImageItem> images) {this.images = images;this.mContext = ctx;}@Overridepublic int getCount() {return  images.size();}@Overridepublic ImageItem getItem(int position) {return images.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {final ViewHolder holder;if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.image_grid_item, null);holder = new ViewHolder();holder.ivPic = (ImageView) convertView.findViewById(R.id.iv_thumb);holder.cbSelected = (SuperCheckBox) convertView.findViewById(R.id.iv_thumb_check);holder.cbPanel = convertView.findViewById(R.id.thumb_check_panel);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}final ImageItem item = getItem(position);ViewGroup.LayoutParams params = holder.ivPic.getLayoutParams();params.width = params.height = imageGridSize;Picasso.with(holder.ivPic.getContext()).load(new File(item.path)).centerCrop().resize(imageGridSize/4*3, imageGridSize/4*3).placeholder(R.drawable.default_img).into(holder.ivPic);return convertView;}class ViewHolder {ImageView ivPic;SuperCheckBox cbSelected;View cbPanel;}public void refreshData(List<ImageItem> items) {if (items != null && items.size() > 0) {images = items;}notifyDataSetChanged();}}

上面的代码是一个ListView GridView数据渲染的常见写法,相信大家很熟悉了,在getView中获取到图片,通过Picasso来进行本地图片的展示。

总结

上面的例子,通过Loader加载数据的代码其实不过10多行,其他的代码大部分是数据渲染展示。可见Android提供的Loader异步数据查询工具类是多么的强大!那么大家可以用Loader来自己实现一个类似微信的图片选择。有了Loader,其他的都是逻辑很处理的问题。

如果我的文章对你有帮助,欢迎关注我~

Android 使用Loader轻松实现仿微信图片加载相关推荐

  1. Android笔记之(图片高斯+Glide实现微信图片加载策略+仿微信进度条)

    很久以前就想自己实现一下仿微信图片加载的那种策略了,先加载一张模糊的图片,然后再加载清晰大图,今天研究了一下,不过要是Glide支持进度条显示就好了,不得不说Glide很强大, 不啰嗦了,直接上代码了 ...

  2. 仿新浪微博图片加载进度条——JLPieProgressView

    2019独角兽企业重金招聘Python工程师标准>>> JLPieProgressView 仿新浪微博图片加载进度条 实现代码如下: #import "JLPieProgr ...

  3. 圆形进度条(包括仿QQ图片加载进度图)

    原文:圆形进度条(包括仿QQ图片加载进度图) 源代码下载地址:http://www.zuidaima.com/share/1581277496822784.htm 以前找到的自定义圆形进度条

  4. Android开发之使用GridView+仿微信图片上传功能(附源代码)

    前言:如果转载文章请声明转载自:https://i.cnblogs.com/EditPosts.aspx?postid=7419021  .另外针对有些网站转载本人的文章结果源码链接不对的问题,本人在 ...

  5. Android 高仿ImageLoader图片加载

    一.首先,废话不多说,先上图片 二.实现思路 1.缓存在本地和内存中,每次加载都从本地中读取,如果本地没有则从网络下载,并保存到本地或者内存 2.内存缓存使用软引用和LruCache算法 3.本地缓存 ...

  6. Android踩坑日记:使用Fesco图片加载库在GridView上的卡顿优化

    1,fresco是一个强大的图片加载库 2,fresco设计了一个叫做image pipeline(图片管道)的模块,它负责从从网络,从本地文件系统,从本地资源加载图片,为了最大限度节约资源和cpu时 ...

  7. PC端打不开微信公众号文章、微信图片加载超缓慢的处理方法(最全的解决方法)

    前言 电脑端的微信加载好友发来的图片非常慢,打开公众号的一些文章时,只能加载文字部分,图片部分加载不出来,排除网络的原因后,以下是几种解决方法. 1.-微信的安装盘,缓存文件过大,硬盘无法存放,可以尝 ...

  8. android 仿微信加载框,Android自定义控件——仿微信半透明加载框

    在我们的app中不免回遇到耗时操作,这时我们给个加载框进行过度,使用户体验大大加强. 一.CustomDialog类的编写 package com.daqsoft.jingguan.weight; i ...

  9. 使用Glide模仿微信图片加载策略

    为什么要对图片进行压缩 比较压缩与否造成的资源消耗 你能区别出:下面两个九方格图片展示的区别不? 图1: 图2: 区别在于:图1使用的是压缩图,图2使用的是高清图 以下是高清图地址 http://o9 ...

  10. Android中用URL模拟一个简单的图片加载器

    首先,需要添加权限. <uses-permission android:name="android.permission.INTERNET"/> 整体代码如下: pac ...

最新文章

  1. 基于crc32实现的内存的代码校验
  2. 成功解决WARNING:tensorflow:Variable += will be deprecated. Use variable.assign_add if you want assignmen
  3. 【Java自顶向下】HashMap面试题(2021最新版)
  4. 【webGL入门2】点线面的绘制
  5. IE6、7 a链接内图片加滤镜后导致a标签链接失效问题解决
  6. 全球最快!小米发布超级无线闪充技术,小米9 Pro 5G将首发搭载
  7. ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)
  8. 线条边框简笔画图片大全_表情包丨表情包简笔画图片大全可爱
  9. 【vn.py学习笔记(七)】vn.py rqdata封装、datasbase等数据服务源码阅读
  10. 麻省理工18年春软件构造课程阅读09“避免调试”
  11. html文字阴影效果图,CSS3 -- 文字阴影(text-shadow)
  12. c语言编译器中cu是什么意思,.c文件调用.cu中的函数
  13. 机器学习之决策树CART算法
  14. sCrypt 合约中的椭圆曲线算法:第二部分
  15. 含有js的英文单词_常用的js单词整理
  16. LeetCode207: 课程表(字节手撕算法拓扑排序)
  17. 应用程序“Parallels Desktop“无法打开MAC电脑打不开
  18. JTextField:单行文本框组件
  19. 当代最值得收藏的画家作品_「 中国当代最具收藏价值画家」——钟铃作品展...
  20. 【SSM】13-Spring中实现依赖注入的两种方式(xml和注解)

热门文章

  1. 魅族4usb计算机连接,魅族MX4如何连接电脑 魅族MX4连接电脑方法
  2. The Security Database on the Server Does Not Have a Computer Account
  3. html调用电脑/手机摄像头拍照上传+百度文字识别
  4. Deepest Station
  5. MySQL江湖路 | 专栏目录
  6. mysql面试题总结_mysql面试题小结
  7. 如何用微信自动添加wifi连接服务器地址,微信WiFi一键连小程序怎么用 微信怎么连接WiFi热点...
  8. 第3课:中移物联网蜂窝通信模组OpenCPU探秘
  9. 网络优化需要学习什么
  10. 2022-2028年中国新疆旅游行业发展动态及投资前景分析报告