ListView之数据加载

1 需求

数据库中获取数据;

滑动加载数据;

显示数据的时候为不影响手机性能和增加手机的流量负担,每次只加载少量的数据;不滑动,则不加载新的数据。

 

2 解决思路

2.1 定义你的数据集,根据实际情况而定;

2.2假定数据集List,这里面先存放首次下载的数据,比如先下载10条;

2.3滑动到页尾的时候,添加加载画面,同时开个线程下载后面10条数据,每下载好10条数据就添加到你定义的数据集里面,然后在这个线程里面发个handler消息通知主线程,在handlerMessage()里面调用adapter.notifyDatabaseChanged()方法刷新界面;

2.4 所有数据记载完后,移除页脚View

 

3 实现

 

3.1 下载数据的线程

 

/**
* [更新数据线程]
*/	
private void updateItemInfoList() {
		
		fechDataThread = new Thread(new Runnable() {

			@Override
			public void run() {
				if (ItemInfoList.size() < count) {//count为数据总数
					ItemInfoListTemp = getInfo();//获取本次加载的数据
				} else {
					//所有数据都取完
					ItemInfoListTemp = null;
				}

				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				Message message = new Message();
				message.what = 1;
				ListViewUpdate.this.getHandler().sendMessage(message);
			}

		});
		fechDataThread.start();
	}


 

3.2 数据库中取出数据封装。此处是模拟数据

 

 

/**
* [每次取出等量条数据放入ItemInfoTemp]
*/
	private List< ItemInfo > getInfo() {

		ArrayList< ItemInfo > ItemInfoTemp = new ArrayList< ItemInfo >();
		
		//模拟数据
		for(int i=0;i<10;i++){
			ItemInfo info = new ItemInfo();
			info.setIcon(icon);
			info.setTitle("Title"+i);
			info.setContent("Content"+i);			ItemInfoTempList.add(info);
		}
		return ItemInfoTemp;
	}


 

3.3 Handler发送消息

/**
* [Handler消息机制]
* @return Handler
*/
	private Handler createHandler() {
		Handler handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				switch (msg.what) {
				case 1:
					if (ItemInfoListTemp != null) {
						ItemInfoList
								.addAll(ItemInfoListTemp);
						ItemAdapter
								.notifyDataSetChanged();//刷新界面
						loading.setVisibility(View.GONE);
						refreshable = true;//初始化为false
					} else {
						loading.setVisibility(View.GONE);
						Toast.makeText(mContext,
								"已显示全部数据!",
								Toast.LENGTH_LONG).show();
						listView.removeFooterView(loading);//数据全部加载完成,移除页脚
					}
					break;
				default:
					break;
				}
			}
		};
		return handler;
	}


 

3.4 重写onScroll方法

@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		if ((firstVisibleItem + visibleItemCount == totalItemCount)
				&& (totalItemCount != 0)) {
			if (refreshable) {
				refreshable = false;
				loading.setVisibility(View.VISIBLE);
				updateItemInfoList ();
			}
		}
	}


 4 截图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值