ListView异步延迟加载

有些时候ListView的每个item的内容可能比较复杂,需要一系列的操作才能完成,比较耗时,此时应该用异步加载的方式去获取数据,然而仅仅通过这样处理有时并不能达到很好的效果,item很多的时候(比如有几百上千项)一直往下滑动也可能会造成界面卡顿或者OOM,这是因为每滑过一个item时都会试图用异步去请求数据,而数据还没有返回或已返回时已经滑到下面的item中了,这种情况这样做是非常浪费资源的。

我们刷朋友圈或微博的时候细心一点可以发现,加载的时候大概分两步

  • 请求基本的json数据,生成ListView
  • 在滑动停下来的时候才去加载图片等数据

不多扯了,直接说实现部分:
封装一个LazyListView继承自ListView

package com.turbo.listviewtest;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
import android.widget.AbsListView;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

/**
 * 懒加载ListView(只在ListView滑动截止时才加载复杂数据)
 * Created by Turbo on 2015/12/4.
 */
public class LazyListView extends ListView implements AbsListView.OnScrollListener{
   

    private static final String TAG = "LazyListView";
    private OnScrollListener onScrollListener;

    private int oldVisibleItemCount=0;

    private OnLazyLoadListener onLazyLoadListener;


    //记录Item的懒加载情况
    //比如(1,true)表示为position为1的item已经懒加载过了
    //(2,false) 表示postion为2的item还没有被懒加载
    private SparseArray<Boolean> itemsNow;

    public LazyListView(Context context) {
        super(context);
        init();
    }

    public LazyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public LazyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        //调用父类的设置监听方法监听滑动事件
        super.setOnScrollListener(this);

        itemsNow=new SparseArray<>();
    }

    /**
     * 覆盖setOnScrollListener方法截取回调
     * @param l
     */
    @Override
    public void setOnScrollListener(OnScrollListener l) {
        this.onScrollListener=l;
    }

    /**
     * 当ListView出现滑动时会回调这个方法
     * 但ListView首次显示时并没有滑动,所以还需要通过onScroll方法判断一下ListView的首次展示
     */
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        //Log.d(TAG, "onScrollStateChanged->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值