Android - RecycleView 使用 Universal-Image-Loader加载优化

1. 背景
刚刚使用了开源图片加载Universal-Image-Loader , 发现在滑动的时候,有些卡顿,就想到了 GridView中 滑动时的优化.
GridView优化 :
http://blog.csdn.net/LABLENET/article/details/48314437
Universal-Image-Loader :
https://github.com/nostra13/Android-Universal-Image-Loader

大神的总结的使用,比官方来的详细 :
http://blog.csdn.net/liu1164316159/article/details/38728259

2.优化
前面的使用,大神的总结已经很详细了,包括缓存,加载等; 但是 在RecyclerView中 使用 PauseScrollListener 时,是使用不了的,只支持ListView和Gridview,这里进行一些优化使用,使其支持RecyclerView;

上篇已经提到了RecyclerView的OnScrollListener 事件 :
http://blog.csdn.net/LABLENET/article/details/48314437
通过 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);
            }

        }


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值