【Android】Handler应用(三):从服务器端分页加载更新ListView

在前面两节中,我们了解了如何从服务器中加载JSON数据。

现在,我们将把服务器中的JSON数据加载更新到ListView。

并且,结合之前博文的  “动态追加分页ListView数据”的相关知识,实现将服务器中的分页JSON数据,填充到ListView中。

 

回顾

以BaseAdapter做适配器的ListView:http://blog.csdn.net/jueblog/article/details/12114513

ListView内数据的动态追加:http://blog.csdn.net/jueblog/article/details/12148259

 

Activity的实现

[java]  view plain copy
 
  1. package com.app.myhandler;  
  2.   
  3. import org.json.JSONArray;  
  4. import org.json.JSONException;  
  5. import org.json.JSONObject;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.os.Handler;  
  10. import android.view.ContextMenu;  
  11. import android.view.ContextMenu.ContextMenuInfo;  
  12. import android.view.LayoutInflater;  
  13. import android.view.MenuItem;  
  14. import android.view.View;  
  15. import android.widget.AdapterView;  
  16. import android.widget.AdapterView.AdapterContextMenuInfo;  
  17. import android.widget.ListView;  
  18. import android.widget.TextView;  
  19. import android.widget.Toast;  
  20.   
  21. import com.app.adapter.MyWeixinJSON;  
  22. import com.app.util.MyApplication;  
  23. import com.app.util.MyThread;  
  24.   
  25. /** 
  26.  * 点击 追加数据的ListView 
  27.  * @author 402-9 
  28.  */  
  29. public class ListViewPage extends Activity {  
  30.     private ListView lv;  
  31.     private MyWeixinJSON mJson;  
  32.     private JSONArray mData = new JSONArray();// JSON数据源  
  33.     private View view_page_footer;// 底部视图  
  34.     private int page = 1;// 加载页码  
  35.     private int totalPage;// 总数据  
  36.     private String url = new String("http://192.168.8.4/wt_guang.php?frm=3g&cid=100");  
  37.     private TextView text_page;  
  38.       
  39.     private Handler handler = new Handler() {  
  40.         public void handleMessage(android.os.Message msg) {  
  41.             try {  
  42.                 String result = msg.obj.toString();  
  43.                 JSONObject object = new JSONObject(result);  
  44.                 totalPage = (Integer) object.get("totalPage");  
  45.                 if(mJson==null) {  
  46.                     mData = (JSONArray) object.get("items");  
  47.                     mJson = new MyWeixinJSON(mData, ListViewPage.this);  
  48.                     lv.setAdapter(mJson);//为ListView绑定适配器     
  49.                 } else {  
  50.                     mData = MyApplication.joinJSONArray(mData, (JSONArray) object.get("items"));  
  51.                     mJson.setList(mData);  
  52.                     mJson.notifyDataSetChanged();  
  53.                 }     
  54.                 text_page.setText("下一页");  
  55.             } catch (JSONException e) {  
  56.                 // TODO Auto-generated catch block  
  57.                 e.printStackTrace();  
  58.             }  
  59.         };  
  60.     };  
  61.   
  62.     @Override  
  63.     protected void onCreate(Bundle savedInstanceState) {  
  64.         // TODO Auto-generated method stub  
  65.         super.onCreate(savedInstanceState);  
  66.         setContentView(R.layout.weixin);  
  67.         lv = (ListView) findViewById(R.id.lv);  
  68.   
  69.         new MyThread(handler, url.toString(), 1).start();  
  70.           
  71.         view_page_footer = LayoutInflater.from(this).inflate(R.layout.view_page_footer, null);  
  72.         lv.addFooterView(view_page_footer);// 添加底部视图  
  73.         lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
  74.             @Override  
  75.             public void onItemClick(AdapterView<?> parent, View view,  
  76.                     int position, long id) {  
  77.                 // TODO Auto-generated method stub  
  78.                 try {  
  79.                     JSONObject jsonObject = (JSONObject) mData.get(position);  
  80.                     Toast.makeText(ListViewPage.this,  
  81.                             jsonObject.getString("title"), Toast.LENGTH_SHORT)  
  82.                             .show();  
  83.                 } catch (JSONException e) {  
  84.                     // TODO Auto-generated catch block  
  85.                     e.printStackTrace();  
  86.                 }  
  87.             }  
  88.         });  
  89.   
  90.         text_page = (TextView) view_page_footer.findViewById(R.id.text_page);  
  91.         text_page.setOnClickListener(new View.OnClickListener() {  
  92.             // 点击按钮 追加数据 并通知适配器  
  93.             @Override  
  94.             public void onClick(View v) {  
  95.                 // TODO Auto-generated method stub  
  96.                 page++;  
  97.                 if(page<=totalPage) {              
  98.                     text_page.setText("正在加载中...");  
  99.                     new MyThread(handler, url+"&p="+page, 1).start();                 
  100.                 } else {  
  101.                     text_page.setText("已是最末页...");  
  102.                     text_page.setEnabled(false);  
  103.                 }  
  104.             }  
  105.         });  
  106.     }  
  107. }  
[java]  view plain copy
 
  1. mData = JsonUtils.joinJSONArray(mData, (JSONArray) object.get("items"));  
所调用的方法为 http://www.cnblogs.com/duanxz/p/3507760.html中提供的方法。

适配器的修改

[java]  view plain copy
 
  1. package com.app.adapter;  
  2.   
  3. import org.json.JSONArray;  
  4. import org.json.JSONObject;  
  5.   
  6. import android.content.Context;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.ImageView;  
  12. import android.widget.TextView;  
  13.   
  14. import com.app.myhandler.R;  
  15.   
  16. public class MyWeixinJSON extends BaseAdapter {  
  17.     private LayoutInflater mInflater;// 动态布局映射  
  18.     private JSONArray list;  
  19.     private Context context;  
  20. //  private int i = 0;  
  21.   
  22.     public void setList(JSONArray list) {  
  23.         this.list = list;  
  24.     }  
  25.   
  26.     public MyWeixinJSON(JSONArray list, Context context) {  
  27.         this.list = list;  
  28.         this.context = context;  
  29.         this.mInflater = LayoutInflater.from(context);  
  30.     }  
  31.   
  32.     @Override  
  33.     public int getCount() {  
  34.         // TODO Auto-generated method stub  
  35.         return list.length();  
  36.     }  
  37.   
  38.     @Override  
  39.     public Object getItem(int position) {  
  40.         // TODO Auto-generated method stub  
  41.         return null;  
  42.     }  
  43.   
  44.     @Override  
  45.     public long getItemId(int position) {  
  46.         // TODO Auto-generated method stub  
  47.         return 0;  
  48.     }  
  49.   
  50.     @Override  
  51.     public View getView(int position, View convertView, ViewGroup parent) {  
  52.         // TODO Auto-generated method stub  
  53.         // System.out.println("正在渲染第"+position+"行  +++  "+ i++);  
  54.         OneView oneView;  
  55.         if (convertView == null) {  
  56.             convertView = mInflater.inflate(R.layout.item_weixin, null);// 根据布局文件实例化view  
  57.             oneView = new OneView();  
  58.             oneView.title = (TextView) convertView.findViewById(R.id.title);// 找某个控件  
  59.             oneView.time = (TextView) convertView.findViewById(R.id.time);  
  60.             oneView.info = (TextView) convertView.findViewById(R.id.info);  
  61.             oneView.img = (ImageView) convertView.findViewById(R.id.img);  
  62.             convertView.setTag(oneView);// 把View和某个对象关联起来  
  63.         } else {  
  64.             oneView = (OneView) convertView.getTag();  
  65.         }  
  66.         JSONObject jObject = null;  
  67.         try {  
  68.             jObject = list.getJSONObject(position);// 根据position获取集合类中某行数据  
  69.             oneView.title.setText(jObject.get("itemID").toString());// 给该控件设置数据(数据从集合类中来)  
  70.             oneView.time.setText(jObject.get("price").toString());  
  71.             oneView.info.setText(jObject.get("title").toString());  
  72.             oneView.img.setBackgroundResource(R.drawable.special_spring_head2);  
  73.             // oneView.img.setImageDrawable(Drawable.createFromStream(new  
  74.             // URI(jObject.getString("pic_url"))., "src"));  
  75.         } catch (Exception e) {  
  76.             // TODO: handle exception  
  77.         }  
  78.         return convertView;  
  79.     }  
  80.   
  81.     /** 把每行布局文件的各个控件包装成一个对象 */  
  82.     private class OneView {  
  83.         TextView title;  
  84.         TextView time;  
  85.         TextView info;  
  86.         ImageView img;  
  87.     }  
  88. }  

JSON数据

最后 瞄一眼服务器上的JSON数据:
[plain]  view plain copy
 
  1. {  
  2.     "totalCount": 9,  
  3.     "totalPage": 2,  
  4.     "items": [  
  5.         {  
  6.             "itemID": "13889239752",  
  7.             "title": "PEACE DOVE 正品* 真兔毛 范儿厚毛衣开衫 清库价",  
  8.             "pic_url": "http://img01.taobaocdn.com/bao/uploaded/i5/T1ELuGXj0yXXbAjkA._083138.jpg",  
  9.             "click_url": "http://item.taobao.com/item.htm?id=13889239752",  
  10.             "price": "98.00",  
  11.             "promotion_price": "0.00",  
  12.             "liked": "0"  
  13.         },  
  14.         {  
  15.             "itemID": "13357878044",  
  16.             "title": "现货 呛口小辣椒11月29日香港行snidel 翻领双排扣毛呢大衣外套",  
  17.             "pic_url": "http://img03.taobaocdn.com/bao/uploaded/i3/T1KTWDXipfXXXmSFDX_113804.jpg",  
  18.             "click_url": "http://item.taobao.com/item.htm?id=13357878044",  
  19.             "price": "278.00",  
  20.             "promotion_price": "0.00",  
  21.             "liked": "0"  
  22.         },  
  23.         {  
  24.             "itemID": "12740033159",  
  25.             "title": "2011新款呛口小辣椒子萱王翔貉子毛毛领军绿色工装棉服棉衣大衣",  
  26.             "pic_url": "http://img01.taobaocdn.com/bao/uploaded/i1/T1WiCoXi4BXXad.Qs9_073952.jpg",  
  27.             "click_url": "http://item.taobao.com/item.htm?id=12740033159",  
  28.             "price": "628.00",  
  29.             "promotion_price": "0.00",  
  30.             "liked": "0"  
  31.         },  
  32.         {  
  33.             "itemID": "8603809978",  
  34.             "title": "圣诞款大衣 三色入",  
  35.             "pic_url": "http://img01.taobaocdn.com/bao/uploaded/i1/T1GWXTXhhxXXaMGqo3_045745.jpg",  
  36.             "click_url": "http://s.click.taobao.com/t_8?e=7HZ6jHSTZTlU5Xur%2B%2F50d2poSR5Ba0A%2Fi8tpiW6m04z%2BWKzb6yELcZsJq6zxF7EMTqmpst%2FNOGepsZQvjjXKR0huW7F8S1whVzYKzICAu1lT&p=mm_10009952_0_0",  
  37.             "price": "165.00",  
  38.             "promotion_price": "0.00",  
  39.             "liked": "0"  
  40.         },  
  41.         {  
  42.             "itemID": "10629952619",  
  43.             "title": "裁诺 春装新款2012女装 韩版带帽中长款加厚卫衣 女 秋冬外套大码",  
  44.             "pic_url": "http://img01.taobaocdn.com/bao/uploaded/i1/T1PASfXfpoXXc.O0vb_093452.jpg",  
  45.             "click_url": "http://item.taobao.com/item.htm?id=10629952619",  
  46.             "price": "158.00",  
  47.             "promotion_price": "0.00",  
  48.             "liked": "0"  
  49.         },  
  50.         {  
  51.             "itemID": "9158721999",  
  52.             "title": "清仓包邮 出口欧美大码超酷水洗打磨斜开襟修身加厚抓绒卫衣外套",  
  53.             "pic_url": "http://img03.taobaocdn.com/bao/uploaded/i3/T12t5KXXJqXXbjSw.8_100610.jpg",  
  54.             "click_url": "http://s.click.taobao.com/t_8?e=7HZ6jHSTZPhaK%2FmBeumaH2YuQWkORNRTfXSCf08v9iowvo%2F0Akhswsb9gfNlScFQL%2Bc%2Bp%2BFUQiV5QW7qQyiq%2BJQ4CS399exvrZIKVVH3ZZNULw%3D%3D&p=mm_10009952_0_0",  
  55.             "price": "398.00",  
  56.             "promotion_price": "0.00",  
  57.             "liked": "0"  
  58.         }  
  59.     ]  
  60. }  

效果图

由于服务器JSON数据是比较随意找的,所以内容不是很适合“微信”屏幕。
不要在意这些细节、、、
 
程序执行的第一页:
【Android】Handler应用(三):从服务器端分页加载更新ListView
 
点击下一页,将会动态追加第二页的数据
【Android】Handler应用(三):从服务器端分页加载更新ListView
 
由于服务器中只有两页数据,所以当再次点击“下一页”时,会显示“已是最末页”
【Android】Handler应用(三):从服务器端分页加载更新ListView

你可能感兴趣的:(ListView)