前言:在前面的基础上,进一步更改代码,让用户自己到底刷新的办法我觉得不太好,一般情况下,点击刷新还得等一会,倒不如直接快到底的时候自己自动加载内容,为了实现这个功能就要判断当前显示的ITEM是不是到底了,如果到底了就调用加载函数,为了实现在主页面中调用程序,我们又再一次的用到了接口;

效果:

当快到底的时候,程序会自动加载后面的列表

这篇较上篇的改动:

1、去掉了线程互斥加载,直接开线程加载当前IMG,即不判断当前用户是不是在划屏了啥啥的,只要调用到getView()一概加载;

2、重写了ImageAndTextListAdapter类;

一、先看ImageAndTextListAdapter类

全部代码:

[java] view plaincopy
  1. package com.example.try_simpleadapter_new;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.example.try_simpleadapter_new.AsyncImageLoader.ImageCallback;
  5. import com.handmark.pulltorefresh.library.PullToRefreshListView;
  6. import android.R.bool;
  7. import android.app.Activity;
  8. import android.graphics.drawable.Drawable;
  9. import android.graphics.drawable.Drawable.Callback;
  10. import android.util.Log;
  11. import android.view.LayoutInflater;
  12. import android.view.View;
  13. import android.view.ViewGroup;
  14. import android.view.ScaleGestureDetector.OnScaleGestureListener;
  15. import android.widget.AbsListView;
  16. import android.widget.BaseAdapter;
  17. import android.widget.ImageView;
  18. import android.widget.ListView;
  19. import android.widget.TextView;
  20. public class ImageAndTextListAdapter extends BaseAdapter{
  21. private LayoutInflater inflater;
  22. private ListView listView;
  23. private AsyncImageLoader asyncImageLoader;
  24. private List<ImageAndText> dataArray=new ArrayList<ImageAndText>();
  25. private ScrollToLastCallBack mScrollToLastCallBack=null;
  26. public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts,
  27. ListView listView,final ScrollToLastCallBack scrollToLastCallBack) {
  28. this.listView = listView;
  29. asyncImageLoader = new AsyncImageLoader();
  30. inflater = activity.getLayoutInflater();
  31. dataArray=imageAndTexts;
  32. mScrollToLastCallBack=scrollToLastCallBack;
  33. }
  34. public interface ScrollToLastCallBack
  35. {
  36. public void onScrollToLast(Integer pos);
  37. }
  38. @Override
  39. public int getCount() {
  40. // TODO Auto-generated method stub
  41. return dataArray.size();
  42. }
  43. @Override
  44. public Object getItem(int position) {
  45. // TODO Auto-generated method stub
  46. if(position >= getCount()){
  47. return null;
  48. }
  49. return dataArray.get(position);
  50. }
  51. @Override
  52. public long getItemId(int position) {
  53. // TODO Auto-generated method stub
  54. return position;
  55. }
  56. @Override
  57. public View getView(int position, View convertView, ViewGroup parent) {
  58. if (convertView == null) {
  59. convertView = inflater.inflate(R.layout.item, null);
  60. }
  61. convertView.setTag(position);
  62. ImageAndText imageAndText = (ImageAndText) getItem(position);
  63. String imageUrl = imageAndText.getImageUrl();
  64. TextView nameView =  (TextView) convertView.findViewById(R.id.name);
  65. nameView.setText(imageAndText.getName());
  66. TextView infoView =  (TextView) convertView.findViewById(R.id.info);
  67. infoView.setText(imageAndText.getInfo());
  68. ImageView iv = (ImageView) convertView.findViewById(R.id.img);
  69. iv.setBackgroundResource(R.drawable.rc_item_bg);
  70. // 加载IMG,并设定到ImageView中
  71. asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() {
  72. @Override
  73. public void onImageLoad(Integer pos, Drawable drawable) {
  74. Log.d("msg",pos+ "正在贴");
  75. View view = listView.findViewWithTag(pos);
  76. if(view != null){
  77. ImageView iv = (ImageView) view.findViewById(R.id.img);
  78. iv.setBackgroundDrawable(drawable);
  79. Log.d("msg","贴成功了");
  80. }
  81. }
  82. //加载不成功的图片处理
  83. @Override
  84. public void onError(Integer pos) {
  85. View view = listView.findViewWithTag(pos);
  86. if(view != null){
  87. ImageView iv = (ImageView) view.findViewById(R.id.img);
  88. iv.setBackgroundResource(R.drawable.rc_item_bg);
  89. }
  90. Log.d("msg","没贴成功");
  91. }
  92. });
  93. //判断当前列表所在位置,当到最后两项时就加载
  94. int end=listView.getLastVisiblePosition();
  95. if(getCount()-2<=end&&end<=getCount())
  96. {
  97. mScrollToLastCallBack.onScrollToLast(position);
  98. }
  99. return convertView;
  100. }
  101. }

1、第一个改动,增加了接口

[java] view plaincopy
  1. public interface ScrollToLastCallBack
  2. {
  3. public void onScrollToLast(Integer pos);
  4. }

2、ImageAndTextListAdapter构造函数

[java] view plaincopy
  1. public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts,
  2. ListView listView,final ScrollToLastCallBack scrollToLastCallBack) {
  3. this.listView = listView;
  4. asyncImageLoader = new AsyncImageLoader();
  5. inflater = activity.getLayoutInflater();
  6. dataArray=imageAndTexts;
  7. mScrollToLastCallBack=scrollToLastCallBack;
  8. }

增加了ScrollToLastCallBack的传递,说明在构造ImageAndTextListAdapter变量时,要传进来ScrollToLastCallBack回调函数的实例,咱们看看这个函数在哪里调用
3、调用位置public View getView(……) 

[java] view plaincopy
  1. //判断当前列表所在位置,当到最后两项时就加载
  2. int end=listView.getLastVisiblePosition();
  3. if(getCount()-2<=end&&end<=getCount())
  4. {
  5. mScrollToLastCallBack.onScrollToLast(position);
  6. }

在getView(……)函数中,首先获得当前的显示位置,如果当前的显示位置在最后两个ITEM里了,这里就调用mScrollToLastCallBack.onScrollToLast(position)回调函数,下面我们再看看这个回调函数传进去的时候是怎么写的。

二、MainActivity.java

这里我们只看OnCreate()函数,其它地方都没变

[java] view plaincopy
  1. public void onCreate(Bundle savedInstanceState) {
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);
  5. //设定下拉监听函数
  6. mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
  7. @Override
  8. public void onRefresh(PullToRefreshBase<ListView> refreshView) {
  9. String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),
  10. DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);
  11. // Update the LastUpdatedLabel
  12. refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);
  13. // Do work to refresh the list here.
  14. new GetDataTask().execute();
  15. }
  16. });
  17. //       当用户拉到底时调用
  18. mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {
  19. @Override
  20. public void onLastItemVisible() {
  21. Toast.makeText(MainActivity.this, "End of List!", Toast.LENGTH_SHORT).show();
  22. //              // 到底时加载任务
  23. //              new GetDataTask().execute();
  24. }
  25. });     //PullToRefreshBase
  26. mPullRefreshListView.setMode(Mode.PULL_FROM_START);// 设置底部下拉刷新模式
  27. //传参生成适配器
  28. mData = getData();
  29. ListView actualListView = mPullRefreshListView.getRefreshableView();
  30. //自己写的回调函数,监听当前列表是否到了倒数第二个列表项
  31. ScrollToLastCallBack scrollToLastCallBack=new ScrollToLastCallBack(){
  32. @Override
  33. public void onScrollToLast(Integer pos) {
  34. // TODO Auto-generated method stub
  35. Toast.makeText(MainActivity.this, "到倒数第二个了,加载哈", Toast.LENGTH_SHORT).show();
  36. // 到底时加载任务
  37. new GetDataTask().execute();
  38. }
  39. };
  40. adapter = new ImageAndTextListAdapter(this,mData,actualListView,scrollToLastCallBack);
  41. // 设置适配器
  42. actualListView.setAdapter(adapter);
  43. }

这里的变动在最下面,看这段代码:

[java] view plaincopy
  1. //自己写的回调函数,监听当前列表是否到了倒数第二个列表项
  2. ScrollToLastCallBack scrollToLastCallBack=new ScrollToLastCallBack(){
  3. @Override
  4. public void onScrollToLast(Integer pos) {
  5. // TODO Auto-generated method stub
  6. Toast.makeText(MainActivity.this, "到倒数第二个了,加载哈", Toast.LENGTH_SHORT).show();
  7. // 到底时加载任务
  8. new GetDataTask().execute();
  9. }
  10. };
  11. adapter = new ImageAndTextListAdapter(this,mData,actualListView,scrollToLastCallBack);

先构造一个scrollToLastCallBack回调函数,函数内容就是当到倒数第二个ITEM时提示,然后执行加载任务(GetDataTask()),最后将其传到ImageAndTextListAdapter构造函数中。

OK,到这就结束了,其实就是一个回调函数的书写,难度不大,只是在涉及代码量大了的话就相对来讲有点小难度了。

最后,源码来啦:http://download.csdn.net/detail/harvic880925/6804687 (不要分,仅供分享)

请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/17792755 ,谢谢!!

转载于:https://www.cnblogs.com/xieyuan/p/3787276.html

PullToRefresh使用详解(四)--利用回调函数实现到底加载相关推荐

  1. Android之利用回调函数onCreateDialog实现加载对话框

    效果图: 有时候我们需要去做一个Activity启动时的数据加载对话框,关于对话框的各种实现可以通过一起学android之对话框 Dialog的创建(7)来完成,在这里另外介绍一个,利用onCreat ...

  2. mybatis update返回值_mybatis 详解(六)通过mapper接口加载映射文件

    通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的.那么什么是通过 mapper 接口加载映射文件呢? 我们首先看以前的做法,在全局配置文件 mybatis-conf ...

  3. ajax加载vue数据,详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用vue.js结合jquery ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 demo {{message }} 测试jqu ...

  4. HTML5 API详解(7):link prefetch提升加载速度,优化体验

    链接预取:浏览器会自动在后台把你需要加载的页面下载下来,当用户要点击进入该页面的时候,浏览器会从缓存把这个页面取出来,页面的加载速度就会加快. 标签属性:rel='next' 页面预加载很简单,只需要 ...

  5. android verticalviewpager 下拉刷新 上拉加载_设计规范 | 详解组件控件结构体系:加载类...

    设计师在进行APP设计时,往往会更加专注于界面的布局.界面和界面之间怎么跳转.操作反馈,却往往忽略掉一个比较重要的环节,就是APP数据加载中的设计.那么我们怎么处理好界面交互中的加载设计,保证体验无缝 ...

  6. linux 进程间通信 dbus-glib【实例】详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  7. 详解c语言main函数、printf函数、scanf函数与va家族

    C语言入门与提升(1)--详解c语言main函数.printf函数与scanf函数,与va家族 前言: 为什么要学习C语言呢?C语言作为最古老的语言之一,走过了半个多世纪的风风雨雨,至今仍然长盛不衰, ...

  8. 字符编码详解及利用C++ STL string遍历中文字符串

    作者:非妃是公主 专栏:<笔记><C++> 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成.--曾国藩 文 ...

  9. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  10. python从random生成列表_详解Python利用random生成一个列表内的随机数

    详解Python利用random生成一个列表内的随机数 首先,需要导入random模块: import random 随机取1-33之间的1个随机数,可能重复: random.choice(range ...

最新文章

  1. python过采样代码实现_过采样中用到的SMOTE算法
  2. [UE4]虚幻引擎的C++环境安装
  3. 爬取虎牙之一:(王者荣耀主播信息普通爬取)
  4. 在word中使用notepad++实现代码的语法高亮
  5. 日志长度_Kafka 日志存储详解
  6. MySQL 高可用架构在业务层面细化分析研究
  7. 混合云备份服务 > 产品简介 > 什么是混合云备份
  8. mysql 安装导航_ubuntu下安装Mysql
  9. JavaWeb——springMVC异常处理器
  10. windows系统 Git Server git服务器自己搭建 (基于 Gitblit or Gogs )
  11. coreldrawx4缩略图显示不出来_CorelDRAW缩略图不显示解决办法
  12. Python爬取当当网图书数据
  13. 集合论—集合的基本运算与主要算律
  14. matlab怎么新建文件运行不了,关于:Matlab中直接双击fig文件运行出错,而从.m文件运行却不会出错问题的一点心得...
  15. WebDAV之葫芦儿·派盘+Ever play播放器
  16. Php 股票系统,利用PHP命令行模式采集股票趋势信息
  17. 赠书 | 四大通证类型:价值创新的源头
  18. linux查看固态硬盘寿命,CentOS下查看 ssd 寿命
  19. python股票分析论文_股票分析与资产组合(python)
  20. HDU1273-漫步森林

热门文章

  1. 网站集成paypal快捷支付
  2. Android开发——通过扫描二维码,打开或者下载Android应用
  3. [转]整理关于java的String 类,equals函数和比较操作符的区别
  4. Windows活动目录(域服务器)经典系列图文教程
  5. Oracle 开放源代码项目
  6. iOS UITextField设置起始字符开始位置
  7. Java 中的 AQS 到底是什么?高级面试必问!
  8. 80%的程序员不了解的微服务内幕
  9. 一幅漫画趣味解读 Linux 内核
  10. 少讲大道理,多解决小问题