[douban] 04_我读-ListView优化3-ListView中的分批加载(图片异步加载,内存缓存图片-软引用,分批加载)

Android 4.0

ListView中的分批加载(图片异步加载,内存缓存图片-软引用,分批加载)

listview分批加载,listview分页加载
分批加载:第一次加载10个,第二次往adapter再加入10个,显示20个,往后依次加入更多,
分页加载:每次只显示10个,数据适配器中显示的条目数是固定的。
1、为listview设置滚动事件
①如果当前滚动状态为静止状态
②并且listview里面最后一个用户可见的条目内容 等于listview数据适配器里面的最后一个条目
2、数据适配器MyReadAdapter添加更多数据的方法
/**
 * 添加更多的书到MyReadAdapter数据适配器中
 * 
 * @param books
 */
public void addMoreBook(List<Book> books) {
    for (Book book : books) {
        this.books.add(book);
    }
}
3、然后异步加载数据,​fillData(),在加载完毕后,更新数据适配器
@Override
protected void onPostExecute(List<Book> result) {
    hiddenLoading();
    if (result != null) {// 获取到了数据
        if (adapter == null) {//数据适配器为null,第一次加载
            adapter = new MyReadAdapter(result);
            subjectlist.setAdapter(adapter);
        } else {//数据适配器不为null
            // 把新获取到的数据 加到listview的数据适配器里面
            adapter.addMoreBook(result);
            // 通知数据适配器更新数据
            adapter.notifyDataSetChanged();
        }
    } else {
        showToast("获取数据失败");
    }
    isloading = false;// 数据加载完毕,置为false
}
4、图片异步加载时,图片跳动导致显示不正确
ListView图片跳动,异步加载图片位置错误显示,异步加载图片闪烁
原因:由于复用convertview,也复用了原先的imageview,导致显示不正确,
解决:
①不复用convertview
②xml中不配置,在代码中动态的添加
LinearLayout llBookIcon = (LinearLayout) view.findViewById(R.id.ll_book_icon);
// 清空ll的里面的view对象
llBookIcon.removeAllViews();
final ImageView ivBookIcon = new ImageView(getApplicationContext());
// 异步加载图片,图片会出现跳动
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
llBookIcon.addView(ivBookIcon, params);
问题1: fillData ,多次快速拖动listview多次加载数据情况,多次加载数据
解决:定义 private boolean isloading;// 是否正在加载新的数据
①在onPreExecute(),刚加载数据时,将其置为true
②在onPostExecute(),加载数据完毕后,将其值为false

问题2:解决在拖动最后一个listview的值时,还显示加载数据界面
解决:定义一个最大的值,在加载数据fillData()前,判断是否超过该值,
如果超过了,那么就不加载了。

完整代码: