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



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

效果:

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


这篇较上篇的改动:

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

2、重写了ImageAndTextListAdapter类;

一、先看ImageAndTextListAdapter类

全部代码:

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

	    public ImageAndTextListAdapter(Activity activity, List<ImageAndText> 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(getCount()-2<=end&&end<=getCount())
	        {
	        	mScrollToLastCallBack.onScrollToLast(position);
	        }
	        return convertView;
	    }
}
1、第一个改动,增加了接口

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

  1. public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts,   
  2.         ListView listView,final ScrollToLastCallBack scrollToLastCallBack) {  
  3.   
  4.     this.listView = listView;  
  5.     asyncImageLoader = new AsyncImageLoader();  
  6.     inflater = activity.getLayoutInflater();  
  7.     dataArray=imageAndTexts;  
  8.       
  9.     mScrollToLastCallBack=scrollToLastCallBack;  
  10. }  
public ImageAndTextListAdapter(Activity activity, List<ImageAndText> 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(……) 

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

二、MainActivity.java

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

  1.     public void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.activity_main);   
  4.           
  5.         mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);  
  6.   
  7.         //设定下拉监听函数  
  8.         mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {  
  9.             @Override  
  10.             public void onRefresh(PullToRefreshBase<ListView> refreshView) {  
  11.                 String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),  
  12.                         DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);  
  13.   
  14.                 // Update the LastUpdatedLabel  
  15.                 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);  
  16.   
  17.                 // Do work to refresh the list here.  
  18.                 new GetDataTask().execute();  
  19.                   
  20.             }  
  21.         });  
  22.           
  23. //       当用户拉到底时调用  
  24.         mPullRefreshListView.setOnLastItemVisibleListener(new OnLastItemVisibleListener() {  
  25.             @Override  
  26.             public void onLastItemVisible() {  
  27.                 Toast.makeText(MainActivity.this"End of List!", Toast.LENGTH_SHORT).show();  
  28. //              // 到底时加载任务  
  29. //              new GetDataTask().execute();  
  30.             }  
  31.         });     //PullToRefreshBase  
  32.           
  33.         mPullRefreshListView.setMode(Mode.PULL_FROM_START);// 设置底部下拉刷新模式  
  34.         //传参生成适配器  
  35.         mData = getData();  
  36.         ListView actualListView = mPullRefreshListView.getRefreshableView();  
  37.           
  38.         //自己写的回调函数,监听当前列表是否到了倒数第二个列表项  
  39.         ScrollToLastCallBack scrollToLastCallBack=new ScrollToLastCallBack(){  
  40.   
  41.             @Override  
  42.             public void onScrollToLast(Integer pos) {  
  43.                 // TODO Auto-generated method stub  
  44.                 Toast.makeText(MainActivity.this"到倒数第二个了,加载哈", Toast.LENGTH_SHORT).show();  
  45.                 // 到底时加载任务  
  46.                 new GetDataTask().execute();  
  47.             }  
  48.               
  49.         };  
  50.         adapter = new ImageAndTextListAdapter(this,mData,actualListView,scrollToLastCallBack);  
  51.   
  52.         // 设置适配器  
  53.         actualListView.setAdapter(adapter);       
  54.     }  
	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<ListView>() {
			@Override
			public void onRefresh(PullToRefreshBase<ListView> 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);		
	}
这里的变动在最下面,看这段代码:
  1. //自己写的回调函数,监听当前列表是否到了倒数第二个列表项  
  2. ScrollToLastCallBack scrollToLastCallBack=new ScrollToLastCallBack(){  
  3.   
  4.     @Override  
  5.     public void onScrollToLast(Integer pos) {  
  6.         // TODO Auto-generated method stub  
  7.         Toast.makeText(MainActivity.this"到倒数第二个了,加载哈", Toast.LENGTH_SHORT).show();  
  8.         // 到底时加载任务  
  9.         new GetDataTask().execute();  
  10.     }  
  11.       
  12. };  
  13. adapter = new ImageAndTextListAdapter(this,mData,actualListView,scrollToLastCallBack);  
		//自己写的回调函数,监听当前列表是否到了倒数第二个列表项
		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,到这就结束了,其实就是一个回调函数的书写,难度不大,只是在涉及代码量大了的话就相对来讲有点小难度了。


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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值