【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的实现
package com.app.myhandler; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast; import com.app.adapter.MyWeixinJSON;
import com.app.util.MyApplication;
import com.app.util.MyThread; /**
* 点击 追加数据的ListView
* @author 402-9
*/
public class ListViewPage extends Activity {
private ListView lv;
private MyWeixinJSON mJson;
private JSONArray mData = new JSONArray();// JSON数据源
private View view_page_footer;// 底部视图
private int page = 1;// 加载页码
private int totalPage;// 总数据
private String url = new String("http://192.168.8.4/wt_guang.php?frm=3g&cid=100");
private TextView text_page; private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
try {
String result = msg.obj.toString();
JSONObject object = new JSONObject(result);
totalPage = (Integer) object.get("totalPage");
if(mJson==null) {
mData = (JSONArray) object.get("items");
mJson = new MyWeixinJSON(mData, ListViewPage.this);
lv.setAdapter(mJson);//为ListView绑定适配器
} else {
mData = MyApplication.joinJSONArray(mData, (JSONArray) object.get("items"));
mJson.setList(mData);
mJson.notifyDataSetChanged();
}
text_page.setText("下一页");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.weixin);
lv = (ListView) findViewById(R.id.lv); new MyThread(handler, url.toString(), 1).start(); view_page_footer = LayoutInflater.from(this).inflate(R.layout.view_page_footer, null);
lv.addFooterView(view_page_footer);// 添加底部视图
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
try {
JSONObject jsonObject = (JSONObject) mData.get(position);
Toast.makeText(ListViewPage.this,
jsonObject.getString("title"), Toast.LENGTH_SHORT)
.show();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}); text_page = (TextView) view_page_footer.findViewById(R.id.text_page);
text_page.setOnClickListener(new View.OnClickListener() {
// 点击按钮 追加数据 并通知适配器
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
page++;
if(page<=totalPage) {
text_page.setText("正在加载中...");
new MyThread(handler, url+"&p="+page, 1).start();
} else {
text_page.setText("已是最末页...");
text_page.setEnabled(false);
}
}
});
}
}
mData = MyApplication.joinJSONArray(mData, (JSONArray) object.get("items"));
所调用的方法为 http://blog.csdn.net/jueblog/article/details/12622423中提供的方法。
适配器的修改
package com.app.adapter; import org.json.JSONArray;
import org.json.JSONObject; import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; import com.app.myhandler.R; public class MyWeixinJSON extends BaseAdapter {
private LayoutInflater mInflater;// 动态布局映射
private JSONArray list;
private Context context;
// private int i = 0; public void setList(JSONArray list) {
this.list = list;
} public MyWeixinJSON(JSONArray list, Context context) {
this.list = list;
this.context = context;
this.mInflater = LayoutInflater.from(context);
} @Override
public int getCount() {
// TODO Auto-generated method stub
return list.length();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// System.out.println("正在渲染第"+position+"行 +++ "+ i++);
OneView oneView;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_weixin, null);// 根据布局文件实例化view
oneView = new OneView();
oneView.title = (TextView) convertView.findViewById(R.id.title);// 找某个控件
oneView.time = (TextView) convertView.findViewById(R.id.time);
oneView.info = (TextView) convertView.findViewById(R.id.info);
oneView.img = (ImageView) convertView.findViewById(R.id.img);
convertView.setTag(oneView);// 把View和某个对象关联起来
} else {
oneView = (OneView) convertView.getTag();
}
JSONObject jObject = null;
try {
jObject = list.getJSONObject(position);// 根据position获取集合类中某行数据
oneView.title.setText(jObject.get("itemID").toString());// 给该控件设置数据(数据从集合类中来)
oneView.time.setText(jObject.get("price").toString());
oneView.info.setText(jObject.get("title").toString());
oneView.img.setBackgroundResource(R.drawable.special_spring_head2);
// oneView.img.setImageDrawable(Drawable.createFromStream(new
// URI(jObject.getString("pic_url"))., "src"));
} catch (Exception e) {
// TODO: handle exception
}
return convertView;
} /** 把每行布局文件的各个控件包装成一个对象 */
private class OneView {
TextView title;
TextView time;
TextView info;
ImageView img;
}
}
JSON数据
{
"totalCount": 9,
"totalPage": 2,
"items": [
{
"itemID": "13889239752",
"title": "PEACE DOVE 正品* 真兔毛 范儿厚毛衣开衫 清库价",
"pic_url": "http://img01.taobaocdn.com/bao/uploaded/i5/T1ELuGXj0yXXbAjkA._083138.jpg",
"click_url": "http://item.taobao.com/item.htm?id=13889239752",
"price": "98.00",
"promotion_price": "0.00",
"liked": "0"
},
{
"itemID": "13357878044",
"title": "现货 呛口小辣椒11月29日香港行snidel 翻领双排扣毛呢大衣外套",
"pic_url": "http://img03.taobaocdn.com/bao/uploaded/i3/T1KTWDXipfXXXmSFDX_113804.jpg",
"click_url": "http://item.taobao.com/item.htm?id=13357878044",
"price": "278.00",
"promotion_price": "0.00",
"liked": "0"
},
{
"itemID": "12740033159",
"title": "2011新款呛口小辣椒子萱王翔貉子毛毛领军绿色工装棉服棉衣大衣",
"pic_url": "http://img01.taobaocdn.com/bao/uploaded/i1/T1WiCoXi4BXXad.Qs9_073952.jpg",
"click_url": "http://item.taobao.com/item.htm?id=12740033159",
"price": "628.00",
"promotion_price": "0.00",
"liked": "0"
},
{
"itemID": "8603809978",
"title": "圣诞款大衣 三色入",
"pic_url": "http://img01.taobaocdn.com/bao/uploaded/i1/T1GWXTXhhxXXaMGqo3_045745.jpg",
"click_url": "http://s.click.taobao.com/t_8?e=7HZ6jHSTZTlU5Xur%2B%2F50d2poSR5Ba0A%2Fi8tpiW6m04z%2BWKzb6yELcZsJq6zxF7EMTqmpst%2FNOGepsZQvjjXKR0huW7F8S1whVzYKzICAu1lT&p=mm_10009952_0_0",
"price": "165.00",
"promotion_price": "0.00",
"liked": "0"
},
{
"itemID": "10629952619",
"title": "裁诺 春装新款2012女装 韩版带帽中长款加厚卫衣 女 秋冬外套大码",
"pic_url": "http://img01.taobaocdn.com/bao/uploaded/i1/T1PASfXfpoXXc.O0vb_093452.jpg",
"click_url": "http://item.taobao.com/item.htm?id=10629952619",
"price": "158.00",
"promotion_price": "0.00",
"liked": "0"
},
{
"itemID": "9158721999",
"title": "清仓包邮 出口欧美大码超酷水洗打磨斜开襟修身加厚抓绒卫衣外套",
"pic_url": "http://img03.taobaocdn.com/bao/uploaded/i3/T12t5KXXJqXXbjSw.8_100610.jpg",
"click_url": "http://s.click.taobao.com/t_8?e=7HZ6jHSTZPhaK%2FmBeumaH2YuQWkORNRTfXSCf08v9iowvo%2F0Akhswsb9gfNlScFQL%2Bc%2Bp%2BFUQiV5QW7qQyiq%2BJQ4CS399exvrZIKVVH3ZZNULw%3D%3D&p=mm_10009952_0_0",
"price": "398.00",
"promotion_price": "0.00",
"liked": "0"
}
]
}
效果图
【Android】Handler的应用(三):从服务器端分页加载更新ListView的更多相关文章
- ListView实现分页加载(三)实现分页加载
在上一篇中,我们实现了底部布局(即带上了进度条).没有读过的朋友可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4866966.html 但是进度条 ...
- Android中获取网络数据时的分页加载
//此实在Fragment中实现的,黄色部分为自动加载,红色部分是需要注意的和手动加载, 蓝色部分是睡眠时间,自我感觉不用写 ,还有就是手动加载时,不知道为什么进去后显示的就是最后一行,求大神 ...
- Android为TV端助力 转载:RecyclerView分页加载
package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...
- Android 图片从网页中获取并动态加载到listview中
实现功能: 效果图: 代码:这里
- Android基本控件之listView(三)<用ListView实现分页加载>
我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...
- java攻城狮之路(Android篇)--widget_webview_metadata_popupwindow_tabhost_分页加载数据_菜单
一.widget:桌面小控件1 写一个类extends AppWidgetProvider 2 在清单文件件中注册: <receiver android:name=".ExampleA ...
- Android三种基本的加载网络图片方式(转)
Android三种基本的加载网络图片方式,包括普通加载网络方式.用ImageLoader加载图片.用Volley加载图片. 1. [代码]普通加载网络方式 ? 1 2 3 4 5 6 7 8 9 10 ...
- Android中ListView分页加载数据
public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...
- 【Android进阶】Listview分页加载数据的实现
Listview分页加载数据的实现 public class MainActivity extends Activity { protected static final int SUCCESS_GE ...
随机推荐
- 最大流 Dinic + Sap 模板
不说别的,直接上模板. Dinic+当前弧优化: struct Edge{ int x,y,c,ne; }e[M*]; int be[N],all; int d[N],q[N]; int stack[ ...
- 宏os_file_read_func
# define os_file_read(file, buf, offset, offset_high, n) \ os_file_read_func(file, buf, offset, offs ...
- truncate table 和delete
delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...
- bzoj1567: [JSOI2008]Blue Mary的战役地图
将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...
- 如何在Asp.Net WebApi接口中,验证请求参数中是否携带token标识!
[BasicAuthentication] public abstract class ApiControllerBase : ApiController { #region Gloal Proper ...
- $http POST 转字符串
- Java [Leetcode 319]Bulb Switcher
题目描述: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ...
- UVa 11300 Spreading the Wealth 分金币
圆桌旁坐着 n 个人,每个人都有一定数量的金币,金币总数能够被 n 整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值,比如 n = 4, ...
- java 访问器方法中对象引用的问题
"注意不要编写返回引用可变对象的访问器方法".因为会破坏类的封装性,引用的内容可能会被改变,产生业务逻辑上的错误. 什么是可变对象? 先要搞清楚java中值传递和引用传递的问题,总结如下: 1.对象就 ...
- ECSHOP v2.5数据库字典
ECSHOP v2.5 数据库字典 ECSHOP R&D Team 2007年4月16日 商品相关表 商品分类表 category 此表用来维护商品分类信息 字段名 字段描述 字段类型 默认值 ...