开源框架 ImageLoader +ListView+GridView+RecyclerView 浅解
下载地址
链接:https://pan.baidu.com/s/1ebz99pcuvHg2bODgeOtSbg 提取码:ia39
一、导入jar包或者添加依赖
导入jar包:将下载的jar包放入到libs目录下,右键选择 “Add as Library”
添加依赖:compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
二、添加权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
三、主要方法
//不要将这段代码拷贝进你的工程。这仅仅是所有配置选项使用的范例。
// 查看sample工程来学习如何正确的使用ImageLoader
//这里的路径可以自定义 File cacheDir = StorageUtils.getOwnCacheDirectory(this,"image/photo")
File cacheDir = StorageUtils.getCacheDirectory(this); ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(this)
// 默认等于你的屏幕尺寸,设备屏幕宽高
.memoryCacheExtraOptions(480, 800)
// 在将下载的图片保存到你的sd卡之前会重新计算,压缩。
// 这个属性不要滥用,只有你在对应的需求时再用,因为他会使你的ImageLoader变的很慢。
.diskCacheExtraOptions(480, 800, null)
//用于执行从源获取图片任务的 Executor,为configuration中的 taskExecutor,
// 如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。
.taskExecutor(null)
//用于执行从缓存获取图片任务的 Executor,为configuration中的 taskExecutorForCachedImages,
// 如果为null,则会调用DefaultConfigurationFactory.createExecutor(…)根据配置返回一个默认的线程池。
.taskExecutorForCachedImages(null)
// 表示核心池大小(最大并发数) 默认为3
.threadPoolSize(3)
// 线程优先级,默认Thread.NORM_PRIORITY - 2
.threadPriority(Thread.NORM_PRIORITY - 2)
// 任务进程的顺序,默认为:FIFO 先进先出
.tasksProcessingOrder(QueueProcessingType.FIFO)
//设置内存缓存不允许缓存一张图片的多个尺寸,默认允许。
.denyCacheImageMultipleSizesInMemory()
//图片内存缓存
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
//memoryCacheSize 为 0,则设置该内存缓存的最大字节数为 App 最大可用内存的 1/8。
.memoryCacheSize(2 * 1024 * 1024)
// 创建最大的内存缓存百分比,默认为 13%
.memoryCacheSizePercentage(13)
// 硬盘缓存路径,默认为StorageUtils.getCacheDirectory(context)
.diskCache(new UnlimitedDiskCache(cacheDir))
//硬盘缓存大小
.diskCacheSize(50 * 1024 * 1024)
//缓存文件数量
.diskCacheFileCount(100)
// 硬盘缓存文件名生成器,默认为哈希文件名生成器
.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
// 创建图片下载器,默认是BaseImageDownloader
.imageDownloader(new BaseImageDownloader(this))
// 图片解码器,负责将图片输入流InputStream转换为Bitmap对象
.imageDecoder(new BaseImageDecoder(true))
// 图片显示的配置项。比如加载前、加载中、加载失败应该显示的占位图片,图片是否需要在磁盘缓存,是否需要在内存缓存等。
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
//是否显示调试log信息
.writeDebugLogs()
.build(); ImageLoader.getInstance().init(config);
// 加载图片
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub) // resource or drawable
.showImageForEmptyUri(R.drawable.ic_empty) // resource or drawable
.showImageOnFail(R.drawable.ic_error) // resource or drawable
.resetViewBeforeLoading(false) // default
.delayBeforeLoading(1000)
.cacheInMemory(false) // default
.cacheOnDisk(false) // default
.preProcessor(...)
.postProcessor(...)
.extraForDownloader(...)
.considerExifParams(false) // default
.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default
.bitmapConfig(Bitmap.Config.ARGB_8888) // default
.decodingOptions(...)
.displayer(new SimpleBitmapDisplayer()) // default
.handler(new Handler()) // default
.build();
ImageLoader.getInstance().displayImage(imageUrl, imageView);
ImageLoader.getInstance().displayImage(imageUrl, imageView,options);
ImageLoader.getInstance().displayImage(imageUrl, imageView, options, listener);
new ImageLoadingListener() {
@Override
public void onLoadingStarted(String s, View view) {
} @Override
public void onLoadingFailed(String s, View view, FailReason failReason) {
} @Override
public void onLoadingComplete(String s, View view, Bitmap bitmap) {
} @Override
public void onLoadingCancelled(String s, View view) {
}
})
四 、具体使用
github https://github.com/MichealPan9999/ImageLoader
4.1 配置ImageLoaderConfiguration
public class BaseApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        initImageLoaderConfig(getApplicationContext());
    }
    private void initImageLoaderConfig(Context context)
    {
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .threadPriority(Thread.NORM_PRIORITY - 2 )
                .threadPoolSize(3)
                .denyCacheImageMultipleSizesInMemory()
                .discCacheFileNameGenerator(new Md5FileNameGenerator())
                .tasksProcessingOrder(QueueProcessingType.FIFO)
                .writeDebugLogs()
                .build();
        ImageLoader.getInstance().init(config);
    }
}
AndroidManifast中修改
<application
android:name=".BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
4.2 配置DisplayImageOptions
private void initImageOptions()
{
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.ic_robot)
.showImageForEmptyUri(R.drawable.ic_robot)
.showImageOnFail(R.drawable.ic_robot)
.cacheInMemory(true)
.cacheOnDisc(true)
.displayer(new RoundedBitmapDisplayer(20))
.build();
}
4.3 加载ImageLoader.getInstance.displayImage(...)
imageLoader = ImageLoader.getInstance();
...
imageLoader.displayImage(imageUrls[i],viewHolder.image,options,animateFirstListener);
//第一个参数为地址,第二个参数为存放图片的控件ImageView第三个参数为DisplayImageOpetions具体实例化,第四个参数为加载过程监听事件。
五、RecyclerView
借此机会介绍一下RecyclerView
5.1 手动导包
RecyclerView在Android5.0之后才有,使用时必须导入support-v7包。
如果在配置布局时发现找不到RecyclerView控件那么我们就得手动导包了
1、找到sdk目录下的aar文件 如:recyclerview-v7-25.0.0.aar
D:\Program Files\androidstudio3\sdk2\extras\android\m2repository\com\android\support\recyclerview-v7\25.0.0\recyclerview-v7-25.0.0.aar
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
2.将aar拷贝到项目libs目录下

3.配置build.gradle
方法一、
在当前module下的build.gradle加上如下红色标识的内容,点击右上角sync now,一段时间后发现此时可以加载到RecyclerView控件说明OK
apply plugin: 'com.android.application'
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.panzq.imageloader2"
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding{
        enabled = true;
    }
}
repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.+'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile(name: 'recyclerview-v7-25.0.0', ext: 'aar')
    implementation files('libs/universal-image-loader-1.9.5.jar')
}
方法二
implementation 'com.android.support:recyclerview-v7:28.0.2'
5.2 获取RecyclerView并配置LayoutManager
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, RecyclerView.VERTICAL));
此处setLayoutManager是设置RecyclerView以哪种形式设置,包括以下三种形式
1.LinearLayoutManager 线性管理器,支持横向、纵向。
//第一个参数获取Context,第二个参数表示方向RecyclerView.HORIZONTAL跟RecyclerView.VERTICAL,第三个表示是否反转
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,RecyclerView.VERTICAL,true));
        
2.GridLayoutManager 网格布局管理器
//第一个参数表示Context,第二个表示显示多少列
mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));
3.StaggeredgridLayoutManager 瀑布式布局管理器
//第一个参数表示显示3行/列 表示垂直翻页还是竖直翻页
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, RecyclerView.HORIZONTAL));
        
5.3 配置Adapter
继承RecyclerView.Adapter<VH>
Adapter主要区别在于
//通过构造方法传入加载布局文件得到的view对象
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return new RecyclerViewHolder(LayoutInflater.from(mContext).inflate(R.layout.recycler_item, viewGroup, false));
} @Override
public void onBindViewHolder(RecyclerViewHolder recyclerViewHolder, int i) {
//通过itemview得到每个图片的pararms对象
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) recyclerViewHolder.itemView.getLayoutParams(); //将高度修改为传入的随机高度
params.height = heights.get(i); //设置修改参数
recyclerViewHolder.itemView.setLayoutParams(params); //通过loader对象的displayImage方法将网址中下载的图片按照设置的图片配置显示再imageview中
loader.displayImage(ImageURL[i], recyclerViewHolder.imageView, dios); }
效果

开源框架 ImageLoader +ListView+GridView+RecyclerView 浅解的更多相关文章
- [转]Android开源框架ImageLoader的完美例子
		
Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...
 - Android开源框架ImageLoader的完美例子
		
本文转载于:http://blog.csdn.net/wwj_748/article/details/10079311 2013年8月19日开源框架之Universal_Image_Loader学习 ...
 - android  listview 替代品recyclerview详解
		
安卓v7支持包下的ListView替代品————RecyclerView RecyclerView这个控件也出来很久了,相信大家也学习的差不多了,如果还没学习的,或许我可以带领大家体验一把这个艺术 ...
 - 【Android】开源项目UniversalImageLoader及开源框架ImageLoader
		
UniversalImageLoader 简单来说就是用于加载图片的一个开源项目,在其项目介绍中是这么写的 支持多线程图片加载 提供丰富的细节配置,比如线程池大小,HTPP请求项,内存和磁盘缓存,图片 ...
 - Android UI-开源框架ImageLoader的完美例子
		
Android开源框架ImageLoader的完美例子 2013年8月19日开源框架之Universal_Image_Loader学习 很多人都在讨论如何让图片能在异步加载更加流畅,可以显示大量图片, ...
 - Android(我还是个菜鸟)——UI-开源框架ImageLoader的完美例子
		
开源框架ImageLoader 可在文件里面找——Desktop.zip(原文件为jar格式) 使用这个框架的好处: 让图片能在异步加载更加流畅,可以显示大量图片,在拖动ListView的时候不会出现 ...
 - 浅谈RecyclerView(完美替代ListView,GridView)
		
Android RecyclerView 是Android5.0推出来的,导入support-v7包即可使用. 个人体验来说,RecyclerView绝对是一款功能强大的控件. 首先总结下Recycl ...
 - 【光速使用开源框架系列】图片加载框架ImageLoader
		
[关于本系列] 最近看了不少开源框架,网上的资料也非常多,但是我认为了解一个框架最好的方法就是实际使用.本系列博文就是带领大家快速的上手一些常用的开源框架,体会到其作用. 由于作者水平有限,本系列只会 ...
 - ListView嵌套GridView使用详解及注意事项
		
ListView嵌套GridView即ListView的每个Item中都包含一个GridView:需要注意的是由于ListView和GridView都是可滑动的控件. 所以需要自定义GridView, ...
 
随机推荐
- python之list+字典练习
			
d = { '春波':{ "car":{'BMW':5,'BENZ':3,'audi':3,'byd':4}, "house":["北京", ...
 - app-web  开发  追溯debug
			
1.iphone5 运行vue项目时,方法格式:fun(){}这种格式容易不显示页面 2.vue未绑定上数据有可能是js文本过大,手机内存不足引起的 3.根据方法走向追溯debug 4.一定要用try ...
 - linux scanf函数%d后加空白
			
参考链接: https://bbs.csdn.net/topics/390389059 关键点: scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一 ...
 - MGR架构~高可用架构细节的梳理
			
一 简介:今天咱们来聊聊mgr的细节原理相关 二 选择新主机制 1 当主节点宕掉,自动会根据服务器的server_uuid变量和group_replication_member_weight变量值 ...
 - Deep Neural Networks for Object Detection(翻译)
			
0 - Abstract 深度神经网络(DNNs)最近在图像分类任务上表现出了突出的性能.在这篇文章中,我们进一步深入探究使用DNNs进行目标检测的问题,这个问题不仅需要对物体进行分类,并且还需要对各 ...
 - Solr版本问题分析
			
在之前的Solr版本中(Solr5之前),在创建core的时候,Solr会自动创建好schema.xml,但是在之后的版本中,新加入了动态更新schema功能,这个默认的schema.xml确找不到了 ...
 - Anaconda使用总结
			
序 Python易用,但用好却不易,其中比较头疼的就是包管理和Python不同版本的问题,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.An ...
 - python3-面向对象进阶(内置方法)
			
面向对象进阶: isinstance和issubclass 反射 __setattr__,__getattr,__delattr__ __setitem__,__getitem,__delitem__ ...
 - python3+selenium入门14-上传下载文件
			
上传文件一种方式是通过定位input标签,然后使用send_keys()方法传入需要上传文件的路径.另一种是使用第三方插件去上传文件.下面看下imput标签的方式.工具可以自己查下. <!DOC ...
 - C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码
			
C++.VC++.MFC网页自动注册.登陆.发帖.留言,QQ注册.QQ申请器源码.注册邮箱源码.自动发帖源码 参考资料: 自动登录yahoo邮箱http://blog.csdn.net/suisu ...