博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PullToRefresh使用详解(四)--利用回调函数实现到底加载
阅读量:2021 次
发布时间:2019-04-28

本文共 7855 字,大约阅读时间需要 26 分钟。

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

相关文章:

1、《》

2、《》

3、《

4、

5、

6、

7、

效果:

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

这篇较上篇的改动:

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

2、重写了ImageAndTextListAdapter类;

一、先看ImageAndTextListAdapter类

全部代码:

package com.example.try_simpleadapter_new;import java.util.ArrayList;import java.util.List;import com.example.try_simpleadapter_new.AsyncImageLoader.ImageCallback;import com.handmark.pulltorefresh.library.PullToRefreshListView;import android.R.bool;import android.app.Activity;import android.graphics.drawable.Drawable;import android.graphics.drawable.Drawable.Callback;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.ScaleGestureDetector.OnScaleGestureListener;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class ImageAndTextListAdapter extends BaseAdapter{		private LayoutInflater inflater;	    private ListView listView;	    private AsyncImageLoader asyncImageLoader;	    private List
dataArray=new ArrayList
(); private ScrollToLastCallBack mScrollToLastCallBack=null; public ImageAndTextListAdapter(Activity activity, List
imageAndTexts, ListView listView,final ScrollToLastCallBack scrollToLastCallBack) { this.listView = listView; asyncImageLoader = new AsyncImageLoader(); inflater = activity.getLayoutInflater(); dataArray=imageAndTexts; mScrollToLastCallBack=scrollToLastCallBack; } public interface ScrollToLastCallBack { public void onScrollToLast(Integer pos); } @Override public int getCount() { // TODO Auto-generated method stub return dataArray.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub if(position >= getCount()){ return null; } return dataArray.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.item, null); } convertView.setTag(position); ImageAndText imageAndText = (ImageAndText) getItem(position); String imageUrl = imageAndText.getImageUrl(); TextView nameView = (TextView) convertView.findViewById(R.id.name); nameView.setText(imageAndText.getName()); TextView infoView = (TextView) convertView.findViewById(R.id.info); infoView.setText(imageAndText.getInfo()); ImageView iv = (ImageView) convertView.findViewById(R.id.img); iv.setBackgroundResource(R.drawable.rc_item_bg); // 加载IMG,并设定到ImageView中 asyncImageLoader.loadDrawable(position,imageUrl, new ImageCallback() { @Override public void onImageLoad(Integer pos, Drawable drawable) { Log.d("msg",pos+ "正在贴"); View view = listView.findViewWithTag(pos); if(view != null){ ImageView iv = (ImageView) view.findViewById(R.id.img); iv.setBackgroundDrawable(drawable); Log.d("msg","贴成功了"); } } //加载不成功的图片处理 @Override public void onError(Integer pos) { View view = listView.findViewWithTag(pos); if(view != null){ ImageView iv = (ImageView) view.findViewById(R.id.img); iv.setBackgroundResource(R.drawable.rc_item_bg); } Log.d("msg","没贴成功"); } }); //判断当前列表所在位置,当到最后两项时就加载 int end=listView.getLastVisiblePosition(); if(end>getCount()-3&&end
<=getCount()) { mScrollToLastCallBack.onScrollToLast(position); } return convertView; }}
1、第一个改动,增加了接口

public interface ScrollToLastCallBack	    {	    	public void onScrollToLast(Integer pos);	    }
2、ImageAndTextListAdapter构造函数

public ImageAndTextListAdapter(Activity activity, List
imageAndTexts, ListView listView,final ScrollToLastCallBack scrollToLastCallBack) { this.listView = listView; asyncImageLoader = new AsyncImageLoader(); inflater = activity.getLayoutInflater(); dataArray=imageAndTexts; mScrollToLastCallBack=scrollToLastCallBack;}
增加了ScrollToLastCallBack的传递,说明在构造ImageAndTextListAdapter变量时,要传进来ScrollToLastCallBack回调函数的实例,咱们看看这个函数在哪里调用
3、调用位置public View getView(……) 

//判断当前列表所在位置,当到最后两项时就加载int end=listView.getLastVisiblePosition();if(getCount()-2<=end&&end<=getCount()){	mScrollToLastCallBack.onScrollToLast(position);}
在getView(……)函数中,首先获得当前的显示位置,如果当前的显示位置在最后两个ITEM里了,这里就调用mScrollToLastCallBack.onScrollToLast(position)回调函数,下面我们再看看这个回调函数传进去的时候是怎么写的。

二、MainActivity.java

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

public void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);					mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);		//设定下拉监听函数		mPullRefreshListView.setOnRefreshListener(new OnRefreshListener
() { @Override public void onRefresh(PullToRefreshBase
refreshView) { String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); // Update the LastUpdatedLabel refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); // Do work to refresh the list here. new GetDataTask().execute(); } }); // 当用户拉到底时调用 mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() { @Override public void onLastItemVisible() { Toast.makeText(MainActivity.this, "End of List!", Toast.LENGTH_SHORT).show();// // 到底时加载任务// new GetDataTask().execute(); } }); //PullToRefreshBase mPullRefreshListView.setMode(Mode.PULL_FROM_START);// 设置底部下拉刷新模式 //传参生成适配器 mData = getData(); ListView actualListView = mPullRefreshListView.getRefreshableView(); //自己写的回调函数,监听当前列表是否到了倒数第二个列表项 ScrollToLastCallBack scrollToLastCallBack=new ScrollToLastCallBack(){ @Override public void onScrollToLast(Integer pos) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "到倒数第二个了,加载哈", Toast.LENGTH_SHORT).show(); // 到底时加载任务 new GetDataTask().execute(); } }; adapter = new ImageAndTextListAdapter(this,mData,actualListView,scrollToLastCallBack); // 设置适配器 actualListView.setAdapter(adapter); }
这里的变动在最下面,看这段代码:
//自己写的回调函数,监听当前列表是否到了倒数第二个列表项		ScrollToLastCallBack scrollToLastCallBack=new ScrollToLastCallBack(){			@Override			public void onScrollToLast(Integer pos) {				// TODO Auto-generated method stub				Toast.makeText(MainActivity.this, "到倒数第二个了,加载哈", Toast.LENGTH_SHORT).show();				// 到底时加载任务				new GetDataTask().execute();			}					};		adapter = new ImageAndTextListAdapter(this,mData,actualListView,scrollToLastCallBack);
先构造一个scrollToLastCallBack回调函数,函数内容就是当到倒数第二个ITEM时提示,然后执行加载任务(GetDataTask()),最后将其传到ImageAndTextListAdapter构造函数中。

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

 

更正声明:

原来这段代码:

int end=listView.getLastVisiblePosition();	        if(getCount()-2<=end&&end<=getCount())	        {	        	mScrollToLastCallBack.onScrollToLast(position);	        }

所存在的问题:我原本打算到倒数第二个ITEM出现时自动加载列表,但这里没能准确定位到倒数第二个ITEM,当倒数第一个ITEM出现时仍然符合条件,致使加载两次,有时出现列表重复的情况;下面更改

int end=listView.getLastVisiblePosition();	        if(end>getCount()-3&&getCount()-1
<=getCount()) { mScrollToLastCallBack.onScrollToLast(position); }

最后,源码来啦: (不要分,仅供分享)

请大家尊重原创者版权,转载请标明出处: ,谢谢!!

你可能感兴趣的文章
WebLogic中的一些基本概念
查看>>
Shell历史
查看>>
ZendStudio中设置SVN:ignore
查看>>
IBM的双机切换HACMP方案介绍
查看>>
使用Ruby简单实现的tail命令,支持动态输出
查看>>
计算质数和回文数的小程序
查看>>
如何为自己的网站规划内容图谱
查看>>
国外的图书出版商如何使用社交化媒体
查看>>
CSS调用远程字体
查看>>
JavaScript Mobile开发框架汇总
查看>>
PhoneGap学习笔记
查看>>
SHELL技巧:处理文件名中的那些空格
查看>>
颜色、网页颜色与网页安全色
查看>>
Yeoman学习与实践笔记
查看>>
设备尺寸杂谈:响应性Web设计中的尺寸问题
查看>>
推荐给开发和设计人员的iPad应用
查看>>
IE对文档的解析模式及兼容性问题
查看>>
几个移动应用统计平台
查看>>
jQuery的animate函数
查看>>
Phonegap项目中禁用WebViewBounce
查看>>