1. 背景
刚刚使用了开源图片加载Universal-Image-Loader , 发现在滑动的时候,有些卡顿,就想到了 GridView中 滑动时的优化.
GridView优化
Universal-Image-Loader :
https://github.com/nostra13/Android-Universal-Image-Loader
大神的总结的使用,比官方来的详细
2.优化
前面的使用,大神的总结已经很详细了,包括缓存,加载等; 但是 在RecyclerView中 使用 PauseScrollListener 时,是使用不了的,只支持ListView和Gridview,这里进行一些优化使用,使其支持RecyclerView;
上篇已经提到了RecyclerView的OnScrollListener 事件
通过 addOnScrollListener 方法添加监听;
优化步骤 :
(1).观察源码
通过观察源码: 可以知道,PauseScrollListener 实现ScrollListener 接口;
在滑动监听状态中实现控制图片的加载和停止;
onScrollStateChanged() 中调用 imageloader 的pause() 和 resume()方法;
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.nostra13.universalimageloader.core.listener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import com.nostra13.universalimageloader.core.ImageLoader;
public class PauseOnScrollListener implements OnScrollListener {
private ImageLoader imageLoader;
private final boolean pauseOnScroll;
private final boolean pauseOnFling;
private final OnScrollListener externalListener;
public PauseOnScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
this(imageLoader, pauseOnScroll, pauseOnFling, (OnScrollListener)null);
}
public PauseOnScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling, OnScrollListener customListener) {
this.imageLoader = imageLoader;
this.pauseOnScroll = pauseOnScroll;
this.pauseOnFling = pauseOnFling;
this.externalListener = customListener;
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch(scrollState) {
case 0:
this.imageLoader.resume();
break;
case 1:
if(this.pauseOnScroll) {
this.imageLoader.pause();
}
break;
case 2:
if(this.pauseOnFling) {
this.imageLoader.pause();
}
}
if(this.externalListener != null) {
this.externalListener.onScrollStateChanged(view, scrollState);
}
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(this.externalListener != null) {
this.externalListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
}
}
(2)实现
通过源码,知道了实现方法,很简单;
只需要实现onScrollStateChanged()方法,进行判断滑动状态,
从而实现暂停和重写加载就可以了
/**
* RecyclerView滑动事件
*/
private class ScrollListListener extends RecyclerView.OnScrollListener {
ImageLoader imageLoader=ImageLoader.getInstance();
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
switch (newState){
case RecyclerView.SCROLL_STATE_DRAGGING:
//正在滑动
imageLoader.pause();
break;
case RecyclerView.SCROLL_STATE_IDLE:
//滑动停止
imageLoader.resume();
break;
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
//请忽视这个方法,这个方法是我自己使用的,判断向上,向下滑动的
/**
* 向下滑动 dy为负数 false
* 向上滑动 dy为正数 true
*/
if (dy > 0) {
TScrollState.upAndDownState(true);
} else {
TScrollState.upAndDownState(false);
}
}
}