PullToRefresh使用详解(三)--实现异步加载的下拉刷新列表

http://blog.csdn.net/harvic880925/article/details/17789617



效果图:

   初始化后,正在加载图片            加载出一部分

    

          下拉刷新                                      新生成的ITEM                               加载完成新生成ITEM的图片

      

 一、MainActivity.java

 其它的代码就不讲了,我只说说这个主页面是如何动作的,先看看整体代码。

 

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.try_simpleadapter_new;  
  2. /** 
  3.  * 完成与服务器通信的下拉刷新 
  4.  * @author harvic 
  5.  */  
  6. import java.io.BufferedReader;  
  7. import java.io.InputStreamReader;  
  8. import java.util.ArrayList;  
  9. import java.util.List;  
  10.   
  11. import org.apache.http.HttpEntity;  
  12. import org.apache.http.HttpResponse;  
  13. import org.apache.http.NameValuePair;  
  14. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  15. import org.apache.http.client.methods.HttpPost;  
  16. import org.apache.http.impl.client.DefaultHttpClient;  
  17. import org.apache.http.message.BasicNameValuePair;  
  18. import org.apache.http.protocol.HTTP;  
  19. import org.json.JSONArray;  
  20.   
  21.   
  22. import com.handmark.pulltorefresh.library.PullToRefreshBase;  
  23. import com.handmark.pulltorefresh.library.PullToRefreshListView;  
  24. import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;  
  25. import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;  
  26.   
  27. import android.os.AsyncTask;  
  28. import android.os.Bundle;  
  29. import android.text.format.DateUtils;  
  30. import android.util.Log;  
  31. import android.widget.ListView;  
  32. import android.app.ListActivity;  
  33.   
  34. public class MainActivity extends ListActivity{  
  35.   
  36.     private String serverIP="http://222.195.151.19";  
  37.     private List<ImageAndText> mData;  
  38.     private PullToRefreshListView mPullRefreshListView;  
  39.     ImageAndTextListAdapter adapter=null;  
  40.     @Override  
  41.     public void onCreate(Bundle savedInstanceState) {  
  42.         super.onCreate(savedInstanceState);  
  43.         setContentView(R.layout.activity_main);   
  44.           
  45.         mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);  
  46.   
  47.         //设定下拉监听函数  
  48.         mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {  
  49.             @Override  
  50.             public void onRefresh(PullToRefreshBase<ListView> refreshView) {  
  51.                 String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),  
  52.                         DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);  
  53.   
  54.                 // Update the LastUpdatedLabel  
  55.                 refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);  
  56.   
  57.                 Log.d("msg","this=="+this);  
  58.                 // Do work to refresh the list here.  
  59.                 new GetDataTask().execute();  
  60.                   
  61.             }  
  62.         });  
  63.   
  64.         mPullRefreshListView.setMode(Mode.PULL_FROM_END);// 设置底部下拉刷新模式  
  65.         //传参生成适配器  
  66.         mData = getData();  
  67.         ListView actualListView = mPullRefreshListView.getRefreshableView();  
  68.         adapter = new ImageAndTextListAdapter(this,mData,actualListView);  
  69.           
  70.         // 设置适配器  
  71.         actualListView.setAdapter(adapter);       
  72.     }  
  73.       
  74.     private List<ImageAndText> getData() {  
  75.         //创建默认的httpClient实例.    
  76.                 DefaultHttpClient httpclient = new DefaultHttpClient();   
  77.                 HttpResponse response = null;  
  78.                 HttpEntity entity = null;  
  79.                   
  80.                 StringBuilder builder = new StringBuilder();    
  81.                 JSONArray jsonArray = null;    
  82.                   
  83.                 List<ImageAndText> list = new ArrayList<ImageAndText>();                  
  84.                                                                        
  85.                 try{  
  86.                      // 创建httpost.访问本地服务器网址    
  87.                     HttpPost httpost = new HttpPost(serverIP+"/try_an_server/index.php");     
  88.                       
  89.                      //构造POST方法的{name:value} 参数对  
  90.                      List <NameValuePair>  vps = new ArrayList <NameValuePair>();     
  91.                      //将参数传入post方法中  
  92.                      vps.add(new BasicNameValuePair("action""insert"));    
  93.                      vps.add(new BasicNameValuePair("name""进去了"));  
  94.                                    
  95.                     httpost.setEntity(new UrlEncodedFormEntity(vps, HTTP.UTF_8));  
  96.                     response = httpclient.execute(httpost);  //执行  
  97.                       
  98.                     if (response.getEntity() != null) {               
  99.                         //如果服务器端JSON没写对,这句是会出异常,是执行不过去的  
  100.                      BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));    
  101.                      String s = reader.readLine();  
  102.                      for (; s != null; s = reader.readLine()) {   
  103.                          builder.append(s);    
  104.                      }    
  105.                      Log.i("msg","builder.toString = "+ builder.toString());   
  106.                        
  107.                      jsonArray = new JSONArray(builder.toString());    
  108.                      for (int i = 0; i < jsonArray.length(); i++) {  
  109.                          if(jsonArray.getJSONObject(i).getInt("id")==1){  
  110.                              String name=jsonArray.getJSONObject(i).getString("name");  
  111.                              String info=jsonArray.getJSONObject(i).getString("info");  
  112.                              String PicName=jsonArray.getJSONObject(i).getString("photo");  
  113.                              String picURL=serverIP+"/try_an_server/"+PicName+".jpg";  
  114.                                
  115.                             ImageAndText item=new ImageAndText(picURL,name,info);  
  116.                             list.add(item);  
  117.                          }  
  118.                      }  
  119.                     }  
  120.                 } catch (Exception e) {  
  121.                     e.printStackTrace();  
  122.                 } finally {  
  123.                     try {  
  124.                          if (entity != null)  
  125.                          {  
  126.                             httpclient.getConnectionManager().shutdown();//关闭连接  
  127.                             //这两种释放连接的方法都可以  
  128.                          }  
  129.                     } catch (Exception e) {  
  130.                         // TODO Auto-generated catch block  
  131.                         e.printStackTrace();  
  132.                     }    
  133.                 }  
  134.   
  135.             return list;      
  136.       
  137.     }  
  138.       
  139.       
  140.       
  141.     private class GetDataTask extends AsyncTask<Void, Void, ImageAndText> {  
  142.   
  143.         //后台处理部分  
  144.         @Override  
  145.         protected ImageAndText doInBackground(Void... params) {  
  146.             // Simulates a background job.  
  147.             ImageAndText item = null;  
  148.             try {  
  149.                 item = new ImageAndText(serverIP+"/try_an_server/xizang.jpg""sss""ssss");                 
  150.             } catch (Exception e) {  
  151.                 // TODO: handle exception  
  152.                 setTitle("map出错了");  
  153.             }  
  154.               
  155.             return item;  
  156.         }  
  157.   
  158.         //这里是对刷新的响应,可以利用addFirst()和addLast()函数将新加的内容加到LISTView中  
  159.         //根据AsyncTask的原理,onPostExecute里的result的值就是doInBackground()的返回值  
  160.         @Override  
  161.         protected void onPostExecute(ImageAndText result) {  
  162.             //在头部增加新添内容  
  163.               
  164.             try {  
  165.                 mData.add(result);  
  166.                   
  167.                 //通知程序数据集已经改变,如果不做通知,那么将不会刷新mListItems的集合  
  168.                 adapter.notifyDataSetChanged();  
  169.                 adapter.loadImage();  
  170.                 // Call onRefreshComplete when the list has been refreshed.  
  171.                 mPullRefreshListView.onRefreshComplete();  
  172.             } catch (Exception e) {  
  173.                 // TODO: handle exception  
  174.                 setTitle(e.getMessage());  
  175.             }  
  176.   
  177.             super.onPostExecute(result);  
  178.         }  
  179.     }  
  180.       
  181.   
  182. }  

分开讲解:
1、先看OnCreate()函数

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list);  
  2.   
  3. //设定下拉监听函数  
  4. mPullRefreshListView.setOnRefreshListener(new OnRefreshListener<ListView>() {  
  5.     @Override  
  6.     public void onRefresh(PullToRefreshBase<ListView> refreshView) {  
  7.         String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),  
  8.                 DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);  
  9.   
  10.         // Update the LastUpdatedLabel  
  11.         refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);  
  12.   
  13.         Log.d("msg","this=="+this);  
  14.         // Do work to refresh the list here.  
  15.         new GetDataTask().execute();  
  16.           
  17.     }  
  18. });  

这段代码先初始化了mPullRefreshListView,然后设置了下拉监听的函数,在下拉时执行GetDataTask()函数;
2、看看GetDataTask()函数做了那些改动

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. private class GetDataTask extends AsyncTask<Void, Void, ImageAndText> {  
  2.     //后台处理部分  
  3.     @Override  
  4.     protected ImageAndText doInBackground(Void... params) {  
  5.         // Simulates a background job.  
  6.         ImageAndText item = null;  
  7.         try {  
  8.             item = new ImageAndText(serverIP+"/try_an_server/xizang.jpg""sss""ssss");                 
  9.         } catch (Exception e) {  
  10.             // TODO: handle exception  
  11.             setTitle("map出错了");  
  12.         }  
  13.           
  14.         return item;  
  15.     }  
  16.   
  17.     //这里是对刷新的响应,可以利用addFirst()和addLast()函数将新加的内容加到LISTView中  
  18.     //根据AsyncTask的原理,onPostExecute里的result的值就是doInBackground()的返回值  
  19.     @Override  
  20.     protected void onPostExecute(ImageAndText result) {  
  21.         //在头部增加新添内容  
  22.           
  23.         try {  
  24.             mData.add(result);  
  25.               
  26.             //通知程序数据集已经改变,如果不做通知,那么将不会刷新mListItems的集合  
  27.             adapter.notifyDataSetChanged();  
  28.             adapter.loadImage();  
  29.             // Call onRefreshComplete when the list has been refreshed.  
  30.             mPullRefreshListView.onRefreshComplete();  
  31.         } catch (Exception e) {  
  32.             // TODO: handle exception  
  33.             setTitle(e.getMessage());  
  34.         }  
  35.   
  36.         super.onPostExecute(result);  
  37.     }  
  38. }  

在doInBackground()中新增了一个ITEM项,然后在onPostExecute()中将这个项加入到mData数据列表中,然后利用adapter.notifyDataSetChanged();通知数据集已经改变;
3、继续OnCreate()函数的剩余部分

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. mPullRefreshListView.setMode(Mode.PULL_FROM_END);// 设置底部下拉刷新模式  
  2. //传参生成适配器  
  3. mData = getData();  
  4. ListView actualListView = mPullRefreshListView.getRefreshableView();  
  5. adapter = new ImageAndTextListAdapter(this,mData,actualListView);  
  6.   
  7. // 设置适配器  
  8. actualListView.setAdapter(adapter);       

首先是设计下拉刷新模式,然后利用GetData()函数返回参数列表,再利用ImageAndTextListAdapter()类生成adapter,最后利用setAdapter()来加载适配器;
 最后就只一个getData()函数没讲了,其实就是向服务器请求JSON数据,然后生成List变量,并返回;代码比较简单,不说了;

 存在问题:最需要注意的是这个东东我在手机上测试是存在问题的,当缓慢滑到顶端或底端时,在onScrollStateChanged()监听函数中并不会激发AbsListView.OnScrollListener.SCROLL_STATE_IDLE:这一项,所以会出现不加载图片的情况,一直显示空白图,我上网搜了下,是手机的问题,不是代码的毛病,但这是很有问题的,最后,我看了其它的应用程序,我还是把上下划动是停止加载的这段代码去掉了,让他一上来就加载,无论用户是否在滑动。至于后面会不会遇到什么问题就后面再说吧,如果哪位大神有好的解决办法,欢迎拍砖!

 

 源码地址:http://download.csdn.net/detail/harvic880925/6804007(不要分,仅供分享)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值