.Net程序员玩转Android开发---(16)ListView分页事件

ListView在加载是数据的时候,如果一次性把所有数据都加载出来,这样如果数据量大的话,效率低,性能差,通常情况下采取的措施是分页加载,只加载当前页数量的数据。这一节我们演示下ListView怎么分页加载数据。首先看下效果图

1. 创建加载进度栏

ListVIew每次加载的时候,会在底部有一个加载进度条栏,显示加载中,我们创建一个这样的布局文件,代码如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
     android:gravity="center"
     android:paddingTop="10dip"
     >

        <ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="正在加载..." />

</LinearLayout>

</LinearLayout>

2. 自定义ListView

上面我们创建了一个加载进度布局文件,接着我们要把这个布局文件添加到ListView中,现在我们创建一个自定义的ListViewPager,自定义的ListViewPager继承ListViiew,通过addFooterView方法,将加载文件添加到listview中, 同时要监听ListView的滚动事件,来加载数据,所以要继承OnScrollListener接口。

package com.example.helloword;

import android.R.bool;
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;

//自定义listview
public class ListViewPager extends ListView implements android.widget.AbsListView.OnScrollListener  {

	View footer;//定义底部view

	int lastItem;//最后一个可见的数量
	int totalItem;//总的数量

	boolean isload;//是否正在加载

	IDataInterface datainter;

	public ListViewPager(Context context) {
		super(context);
		InitFooter(context);
		// TODO Auto-generated constructor stub

	}

    public ListViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        InitFooter(context);
    }

	public ListViewPager(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        InitFooter(context);
    }

	//初始化底部布局栏
	private void InitFooter(Context oontext)
	{
		LayoutInflater  inflater=LayoutInflater.from(oontext);
		//添加底部栏
		footer=inflater.inflate(R.layout.listviewfooter, null);
		footer.setVisibility(View.GONE);//初始化的时候设置底部不可见

		this.addFooterView(footer);
		this.setOnScrollListener(this);

	}

	@Override
	public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub
		//arg1可见的第一个数     arg2可见的数量      arg3总的数量
		this.lastItem=arg1+arg2;//最后一个可见的数等于当前第一个可见的数加上可见的数量
		this.totalItem=arg3;

	}

	//加载完成

	@Override
	public void onScrollStateChanged(AbsListView arg0, int arg1) {
		// TODO Auto-generated method stub  滚动状态等于滚动停止,参数arg1表示滚动状态
		if(lastItem==totalItem&&arg1==SCROLL_STATE_IDLE)
		{
			//最后一个和总的相等说明已经到listview底部
			if(!isload)
			{
				isload=true;
				footer.setVisibility(View.VISIBLE);//设置可见
				Handler  handler=new Handler();
				handler.postDelayed(new Runnable(){
					public void run()
					{

					}

				}, 5000);

				datainter.LoadData();//加载数据
				isload=false;
				//footer.setVisibility(View.GONE);//设置可见
			}

		}

	}

	public void setInterface(IDataInterface data)
	{

		datainter=data;
	}
}

onScroll(AbsListView arg0, int arg1, int arg2, int arg3)有三个重要的参数

arg1表示当前可见的第一个数

arg2表示可见的数量

arg3表示总的数量

onScrollStateChanged(AbsListView arg0, int arg1)表示滚动状态变化

如果滚动状态结束,加载数据。

3.自定义ListView绑定数据

自定义listview创建后,我们创建一个DEMO来绑定数据,首先创建一个布局文件和一个activity文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

     <com.example.helloword.ListViewPager
        android:id="@+id/lvpager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </com.example.helloword.ListViewPager>

</LinearLayout>
package com.example.helloword;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class PageListView extends Activity implements  IDataInterface {

	private ListViewPager lv;
	    SimpleAdapter adp;//定义适配器
	   private List<Map<String,Object>> mapList;//定义数据源  

	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.pagerlistview);
		lv=(ListViewPager)findViewById(R.id.lvpager);
		lv.setInterface(this);
		mapList=new ArrayList<Map<String,Object>>();
    	for(int i=0;i<6;i++)
    	{

    		Map<String,Object> map=new HashMap<String,Object>();
    		map.put("code","编码:1000"+i);
    		map.put("name","名称:Ipad"+i);
    		map.put("price","价格:"+i);
    		map.put("model","单位:"+i);
    		 mapList.add(map);
    	}

    	 adp=new SimpleAdapter(PageListView.this, mapList,R.layout.listdetail, new String[]{"code","name","price","model"}, new int[]{R.id.tvcode,R.id.tvname,R.id.tvprice,R.id.tvmodel});
	      lv.setAdapter(adp);  

	}

	@Override
	public void LoadData() {
		// TODO Auto-generated method stub

		for(int i=10;i<16;i++)
    	{

    		Map<String,Object> map=new HashMap<String,Object>();
    		map.put("code","编码:1000"+i);
    		map.put("name","名称:Ipad"+i);
    		map.put("price","价格:"+i);
    		map.put("model","单位:"+i);
    		 mapList.add(map);
    	}

		adp.notifyDataSetChanged();
	}

}

PageListView中通过接口向自定义LISTVIEW传递数据,所以我们要创建一个接口文件

package com.example.helloword;

public interface IDataInterface {

	 public void LoadData();//加载数据接口
}

demo下载:http://download.csdn.net/detail/zx13525079024/8316547







时间: 2024-10-10 07:10:26

.Net程序员玩转Android开发---(16)ListView分页事件的相关文章

.Net程序员玩转Android开发---(15)ListView滚动事件

Android中的ListView 可以上下滑动,并且上下活动可以分页加载数据,这一节我们看下ListView的滚动事件. ListView的滚动事件主要通过setOnScrollListener监听器来实现,主要包括两个方法onScroll和onScrollStateChanged方法,onScrollStateChanged主要用来监听滚动状态 在滑动过程中向ListView添加数据 ,ListView滚动的时候主要有三个状态,SCROLL_STATE_TOUCH_SCROLL   ,SCR

.Net程序员玩转Android开发---(13)ListView单击事件

大家都知道ListView用来显示数据列表,每一个列表都有列表项组成,如果我们单击选中一个列表,想获取列表中的详细信息或者打开一个新窗口把列表信息传递过去怎么办那?这一节我们演示一下ListView的单击事件,通过这节我们会对ListVIEW有更深入的理解,先看下效果图 下面看下演示代码 主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="ht

.Net程序员玩转Android开发---(12)ListView显示数据

Android中显示数据有多种控件,这节我们来认识下ListView,ListView是Android中最常用的数据显示控件,可以显示简单数据源,也可以显示复杂数据源,我们在Android系统中常看到的列表项,基本都是ListView的功劳.ListView中显示数据,肯定要绑定数据源.数据源的绑定是通过Adapter来完成的,Android中有两种常用的适配器,ArrayAdapter(数组适配器)  SimpleAdapter(简单适配器),适配器的作用就是把复杂的数据源显示到istview

.Net程序员玩转Android开发---(1)环境搭建

对于没有接触过Android开发的人员来说,可能感觉Android开发比较困难,接下来的一段时间,我们将了解Android开发的具体细节,主要是面对.NET程序员,来看看.NET程序员怎样进行Android开发.  下面我们切入本节正题. 工欲善其事,必先利其器,下面我们准备Android开发的环境搭建,下面是开发的一些工具 1. JDK安装   jdk下载 http://www.oracle.com/technetwork/java/javase/downloads/index.html JD

.Net程序员玩转Android开发---(2)Hello World项目创建

对于程序员来说,刚开始接触到的第一个项目都是Hello World, 我们这里第一个项目也从Hello Word创建. 1. 项目创建 运行eclipse.exe文件,打开开发工具eclipse,选择项目存放位置,界面如下 打开eclipse后,选择 file-new--Android Applicaton Project创建Android项目,界面如下 步骤如下 2.

.Net程序员玩转Android开发---(11)页面跳转

在任何程序开发中,都会遇到页面之间跳转的情况,Android开发也不例外.这一节,我们来认识下Android项目中怎样进行页面跳转.页面跳转分为有参数和无参数页面跳转,已经接受另一个页面的返回值等.Android中页面跳转常用到的是Intent ,但是Intent不仅用做页面跳转,还可以做其他事情,例如拨打电话,发送短信,调用其他程序等.这节我们主要认识下怎样通过Intent进行页面跳转. 1.页面跳转 2.带参数页面跳转

.Net程序员玩转Android开发---(3)登陆页面布局

这一节我们来看看登陆页面怎样布局,对于刚接触到Android开发的童鞋来说,Android的布局感觉比较棘手,需要结合各种属性进行设置,接下来我们由点入面来 了解安卓中页面怎样布局,登陆页面很简单,两个文本框和一个按钮,页面效果如下:

.Net程序员玩转Android开发---(17)Handler用法

在android开发中,如果在一个线程中想更新主界面中控件显示的数据,直接给主界面控件赋值就会出现异常,android中为了安全起见,是不允许在线程中更新界面控件的数据,遇到这种情况,我们可以使用Handler.  Handler就是处理界面和线程间的消息传递,通信的组件.下面我们演示下handler处理详细的两种办法

.Net程序员玩转Android开发---(4)注册页面布局

上一篇我们介绍了登陆页面的布局,这一节我们看看注册页面的布局,实际上页面布局大同小异,来一起熟悉下基本控件的用法. 效果图: 1.添加注册页面 右键选中layout文件夹,添加注册页面.如下图 点击完成,页面添加完毕. 在页面中添加控件,XML代码如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com