zoukankan      html  css  js  c++  java
  • 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. }  
    1、第一个改动,增加了接口
    1. public interface ScrollToLastCallBack  
    2. {  
    3.     public void onScrollToLast(Integer pos);  
    4. }  
    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. }  
    增加了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. }  
    在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.     }  
    这里的变动在最下面,看这段代码:
    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回调函数,函数内容就是当到倒数第二个ITEM时提示,然后执行加载任务(GetDataTask()),最后将其传到ImageAndTextListAdapter构造函数中。

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


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

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

  • 相关阅读:
    要看的博客
    sleep(0)的妙用
    Spring Cloud:Eureka的多网卡IP选择问题
    SpringBoot整合swagger
    springboot整合redis(注解形式)
    RSA非对称加密
    java split(regex,limit) 使用记录
    windows git支持arc命令
    eclipse安装反编译插件
    使用@Validated分组遇到的坑
  • 原文地址:https://www.cnblogs.com/xieyuan/p/3787276.html
Copyright © 2011-2022 走看看