.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




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。