基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的RecyclerView分页加载实现。AsyncListUtil作为一种通用的分页加载框架,不仅可以套用在RecyclerView,也可也适用在经典(传统)ListView中,下面给出一个简单例子,说明如何通过AsyncListUtil调整ListView的分页加载机制。
一个简单的MainActivity适用AsyncListUtil和ListView,展示分页加载:

package zhangphil.app;import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.util.AsyncListUtil;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends ListActivity {private final String TAG = "调试";private final int NULL = -1;private AsyncListUtil<DataItem> mAsyncListUtil;private MyAdapter mAdapter;private int mFirstVisibleItem = NULL, mVisibleItemCount = NULL;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);MyDataCallback mDataCallback = new MyDataCallback();MyViewCallback mViewCallback = new MyViewCallback();mAsyncListUtil = new AsyncListUtil(DataItem.class, 20, mDataCallback, mViewCallback);mAdapter = new MyAdapter(this, NULL);setListAdapter(mAdapter);getListView().setOnScrollListener(new AbsListView.OnScrollListener() {@Overridepublic void onScrollStateChanged(AbsListView absListView, int scrollState) {mAsyncListUtil.onRangeChanged();}@Overridepublic void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {mFirstVisibleItem = firstVisibleItem;mVisibleItemCount = visibleItemCount;}});}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {mAsyncListUtil.refresh();}private class MyDataCallback extends AsyncListUtil.DataCallback<DataItem> {@Overridepublic int refreshData() {//更新数据的个数。//假设预先设定更新若干条。return Integer.MAX_VALUE;}/*** 在这里完成数据加载的耗时任务。** @param data* @param startPosition* @param itemCount*/@Overridepublic void fillData(DataItem[] data, int startPosition, int itemCount) {Log.d(TAG, "fillData:" + startPosition + "," + itemCount);for (int i = 0; i < itemCount; i++) {DataItem dataItem = new DataItem();dataItem.pos = startPosition + i;dataItem.content = String.valueOf(System.currentTimeMillis());data[i] = dataItem;//模拟耗时任务,故意休眠一定时延。SystemClock.sleep(100);}}}private class MyViewCallback extends AsyncListUtil.ViewCallback {/*** @param outRange*/@Overridepublic void getItemRangeInto(int[] outRange) {outRange[0] = mFirstVisibleItem;outRange[1] = mFirstVisibleItem + mVisibleItemCount;/*** 如果当前ListView为空,主动为用户加载数据.* 假设预先加载若干条数据**/if (outRange[0] == NULL && outRange[1] == NULL) {Log.d(TAG, "当前ListView为空!");outRange[0] = 0;outRange[1] = 9;}Log.d(TAG, "getItemRangeInto,当前可见position: " + outRange[0] + " ~ " + outRange[1]);}@Overridepublic void onDataRefresh() {mAdapter.notifyDataSetChanged();Log.d(TAG, "onDataRefresh");}@Overridepublic void onItemLoaded(int position) {mAdapter.notifyDataSetChanged();Log.d(TAG, "onItemLoaded:" + position);}}private class MyAdapter extends ArrayAdapter {private ViewHolder holder;public MyAdapter(@NonNull Context context, int resource) {super(context, resource);}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(getApplicationContext()).inflate(android.R.layout.simple_list_item_2, null);holder = new ViewHolder(convertView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.setData(getItem(position));return convertView;}@Overridepublic int getCount() {return mAsyncListUtil.getItemCount();}@Nullable@Overridepublic DataItem getItem(int position) {return mAsyncListUtil.getItem(position);}}private class ViewHolder {public TextView text1;public TextView text2;public ViewHolder(View view) {text1 = view.findViewById(android.R.id.text1);text1.setTextColor(Color.RED);text2 = view.findViewById(android.R.id.text2);text2.setTextColor(Color.BLUE);}public void setData(DataItem dataItem) {if (dataItem == null) {text1.setText("pos加载中...");text2.setText("content加载中...");} else {text1.setText(String.valueOf(dataItem.pos));text2.setText(dataItem.content);}}}private class DataItem {public int pos;public String content;}
}

(一)和RecyclerView一样,我在ListView中同样适用ListView的滚动事件触发AsyncListUtil的onRangeChanged,从而触发分页加载机制开始运作。
(二)作为演示,本例在ListView的普通item点击事件触发一次AsyncListUtil的refresh事件,这种情况模拟当用户长期停留在一个页面需要为用户主动刷新数据的开发场景。
(三)一点儿特别注意:和附录文章1在RecyclerView中的AsyncListUtil.DataCallback不同,在RecyclerView中的DataCallback,加载数据fillData方法的第一个参数data数组,如果作为基本数据类型如String,int等等这类,直接data[i]是没有问题的,data[i]已经被AsyncListUtil创建和初始化完成,但是如果自定义数据类型,比如本例自定义了DataItem,意图装载一些开发者自定义的复杂类型,此时直接取出的data[i]为null!所以,为了解决这个问题,要从两方面入手:
(a)一方面,如果是自定义的数据结构,在fillData中,每一个data[i]为其重新创建new出来一个对象实例,然后赋值给data[i],本例是data[i]=new DataItem()。
(b)另一方面,在最后一关对View进行赋值时候,判断自定义类型是否为null,不会空指针时候才取出自定义数据结构中的数据元素(本例是DataItem中的成员变量)使用。

附录:
1,《基于Android官方AsyncListUtil优化改进RecyclerView分页加载机制(一)》链接:http://blog.csdn.net/zhangphil/article/details/78603499 
2,《基于Android官方Paging Library的RecyclerView分页加载框架》链接:http://blog.csdn.net/zhangphil/article/details/78627332

基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)相关推荐

  1. 分组显示的ListView分页加载数据

    参考:  http://www.cnblogs.com/qianxudetianxia/archive/2011/06/07/2074326.html 分组的ListView的拖拽  http://w ...

  2. js优化阿里云图片加载(二)

    导语:上篇js优化阿里云图片加载中,总结了一种优化的方法,但是每个实现图片缓存的界面都需要注入相关代码,因此考虑是不是有另外一种方式. 优化后的方案:定义一个全局的缓存池来缓存真实路径. 纠结的点:在 ...

  3. Android中ListView分页加载数据

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容 ...

  4. listview分页加载

    熟悉Android的朋友们都知道,不管是微博客户端还是新闻客户端,都离不开列表组件,可以说列表组件是Android数据展现方面最重要的组件,我们今天就要讲一讲列表组件ListView加载数据的相关内容 ...

  5. Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

    Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据 我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页 ...

  6. 联想Android+7,联想ZUK发布ZUI 2.5:基于Android 7.0 优化很强大

    原标题:联想ZUK发布ZUI 2.5:基于Android 7.0 优化很强大 [PConline 资讯]相信很多喜欢联想的用户对于ZUK这个品牌很熟悉吧,做为联想旗下的品牌,ZUK一直也很给力. 而今 ...

  7. Android官方架构组件Paging:分页库的设计美学

    本文已授权 微信公众号 玉刚说 (@任玉刚)独家发布. 2019/12/24 补充 距本文发布时隔一年,笔者认为,本文不应该作为入门教程的第一篇博客,相反,读者真正想要理解 Paging 的使用,应该 ...

  8. 又优化了一下 Android ListView 异步加载图片

    写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...

  9. Android 浏览器内核浅谈,基于WebKit内核的Android手机浏览器的性能研究与加载优化...

    南京邮电大学 硕士 2017 基于WebKit内核的Android手机浏览器的性能研究与加载优化 Performance Research and Load Optimization of Andro ...

最新文章

  1. Spring之定时任务基本使用篇
  2. Linux多线程实践(一)线程基本概念和理论
  3. pytorch volatile 和 requires_grad
  4. python自动化办公入门书籍推荐-盘点使用Python进行自动化办公所需要的知识点
  5. moco 搭建接口mock环境入门
  6. C指针原理(45)-LINUX应用
  7. android获取QQ昵称,【Ctrl.js】QQ读取好友昵称和QQ号源码
  8. java正则表达式非贪婪_正则表达式中的贪婪与非贪婪匹配模式
  9. java方法调用的格式_Java基础(一)---方法的调用
  10. php无限分级快速,PHPTree——php快速生成无限级分类_php技巧
  11. Vector3.MoveTowards与Vector3.Lerp()区别
  12. 世界首席WP(文字处理)布局绘制砖家横空出世
  13. c语言上机实践题库,C语言上机题库
  14. 如何获得CSDN积分
  15. 开发者经验谈:如何一天时间搞定iOS游戏开发?
  16. matlab的发展历史,仿真的发展历程以及目前现状
  17. 微信小程序 函数防抖和函数节流
  18. windows系统命令大全
  19. CF1485C(整除分块+根号分块)
  20. 网站实现快速排名的原理与影响

热门文章

  1. Crawler Index Page
  2. UA MATH567 高维统计II 随机向量10 Grothendieck不等式的证明 版本二:kernel trick
  3. VS2012+WDK8.0搭建WDF驱动开发环境
  4. 初步了解BIM模型和超图相关操作
  5. 超图数据集管理基本操作和添加删除属性表字段
  6. WPF 故事板动画示例
  7. sql server 补齐0学习总结
  8. 3d数学基础学习总结
  9. Kubernetes对象中的PersistentVolume、PersistentVolumeClaim和StorageClass的概念关系
  10. 什么是软件测试架构师?