android分页查询功能工具类的实现

在一个项目中,常常需要频繁的分页,所以有必要实现一个封装的类来统一管理实现。

首先看下效果图:

   从上图我们可以看出,这里是将listview中的数据通过底下的分页工具实现分页显示。那我们接下来先贴出代码:

1、实现布局,这里有两个布局文件,第一个主布局文件main.xml

<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/whole_region"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical" >

                <HorizontalScrollView
                    android:id="@+id/HorizontalScrollView01"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_above="@+id/pagebtn"
                    android:layout_alignParentTop="true" >

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:orientation="vertical" >

                        <LinearLayout
                            android:id="@+id/list_view_title"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:orientation="horizontal">                        
                        </LinearLayout>

                        <ListView
                            android:id="@+id/list"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:fadeScrollbars="false" >
                        </ListView>
                    </LinearLayout>
                </HorizontalScrollView>

                <LinearLayout
                    android:id="@id/pagebtn"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:orientation="vertical" >

                    <include layout="@layout/pagebutton" />
                </LinearLayout>
            </RelativeLayout>

第二个布局文件pagebutton.xml.这个文件嵌套在第一个主文件中。
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent" android:layout_height="fill_parent">
	<TableLayout android:id="@+id/TableLayout1"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		android:stretchColumns="0,1,2,3,4,5,6,7" android:shrinkColumns="0,1,2,3,4,5,6,7" 
		android:paddingTop="5dip" android:paddingLeft="5dip" android:paddingRight="5dip">
		<TableRow>
			<TextView android:text="共" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
			<TextView android:id="@+id/total_page_num" android:minWidth="30dp"
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:textColor="#C71585"
				android:textSize="18sp" />
			<TextView android:text="页" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
			<TextView android:id="@+id/total_record_num"
				android:minWidth="60dp" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textColor="#C71585" android:textSize="18sp" />
			<TextView android:text="条," android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
			<TextView android:text="每页" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
			<TextView android:id="@+id/record_num_each_page"
				android:layout_width="wrap_content" 
                                    android:layout_height="wrap_content"                      
                                    android:textColor="#C71585"
				android:textSize="18sp" />
			<TextView android:text="条" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
		</TableRow>
	</TableLayout>
	<TableLayout android:id="@+id/TableLayout1"
		android:layout_width="fill_parent" android:layout_height="wrap_content"
		android:stretchColumns="0,1,2,3,4,5,6,7" android:shrinkColumns="0,1,2,3,4,5,6,7,8" android:paddingTop="5dip">
		<TableRow>
			<Button android:id="@+id/first_page" android:text="|<"
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:textSize="18sp" />
			<Button android:id="@+id/page_up" android:text=" < "
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:textSize="18sp" />
			<Button android:id="@+id/page_down" android:text=" > "
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:textSize="18sp" />
			<Button android:id="@+id/last_page" android:text=">|"
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:textSize="18sp" />
			<TextView android:text="第" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
			<EditText android:id="@+id/current_page" android:maxWidth="40dip"
				android:singleLine="true" android:layout_width="wrap_content"
				android:layout_height="wrap_content"  android:textColor="#C71585" android:textSize="18sp" />
			<TextView android:text="页" android:layout_width="wrap_content"
				android:layout_height="wrap_content" android:textSize="18sp" />
			<Button android:id="@+id/to_page" android:text="转到"
				android:layout_width="wrap_content" android:layout_height="wrap_content"
				android:textSize="18sp" />
		</TableRow>
	</TableLayout>
</merge>


第二步:新建一个activity,用来显示界面

public class BuilderList1 extends QueryContextActivity {
	private PagedQueryResultHelper pagedQueryResultHelper;
	private Map<String, Object> params;
	private ListView list;
	private List<Integer> columnWidths;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mynotifylist);
		setOnClickListener();
		

		columnWidths = new ArrayList<Integer>();
		int weight = this.getWindowManager().getDefaultDisplay().getWidth();
		columnWidths.add(weight);

		pagedQueryResultHelper = new PagedQueryResultHelper(this);
		pagedQueryResultHelper.setTitleCellWidth(columnWidths);
                  //这个方法是用来查询数据并显示在LISTVIEW中的,我们这次的重点不在这里,我只列出不详讲,有兴趣的朋友可以自己研究下listview		        query();
	}

	

protected void query() {    params = new HashMap<String, Object>();    params.put("userName", UserInfo.getUserName());

    pagedQueryResultHelper.setQueryParams("getBuilderList", params,      "startNum", "endNum", "MyNotifyList", R.array.build_list_name, R.array.build_list);    if (pagedQueryResultHelper.initialQuery() == null) {     new AlertDialog.Builder(this)       .setTitle(R.string.message_title)       .setMessage("没有查询到相关信息,请返回!")       .setPositiveButton(R.string.OK_text, null)       .setPositiveButton(R.string.OK_text,         new DialogInterface.OnClickListener() {          @Override          public void onClick(DialogInterface dialog, int which) {

          BuilderList1.this.finish();

         } }).show();   };

   list = (ListView) findViewById(R.id.list);

   list.setOnItemClickListener(new OnItemClickListener() {     @Override     public void onItemClick(AdapterView<?> adapterView, View view, int index, long arg3) {

     List<Map<String, Object>> data = pagedQueryResultHelper .getWholeResult();      Intent intent = new Intent(BuilderList1.this,FloorInfo.class);      intent.putExtra("value", (Serializable) data.get(index));         intent.putExtra("buildid", data.get(index).get("BUILDID").toString());      startActivity(intent); }});  }

 @Override  public void onClick(View arg0) {      switch (arg0.getId()) {    case R.id.first_page:     pagedQueryResultHelper.firstPage();     break;    case R.id.page_down:      pagedQueryResultHelper.pageDown();     break;     case R.id.page_up:     pagedQueryResultHelper.pageUp();     break;    case R.id.last_page:     pagedQueryResultHelper.lastPage();     break;    case R.id.to_page:     pagedQueryResultHelper.toPage();     break;    }  }

 @Override   protected void clear() {    }

  @Override  protected void setOnClickListener() {    }

}

 

第三步:实现这个工具类,这个类代码有些多
package org.Base.Utils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import org.Base.Activities.QueryContextActivity;
import org.Base.Container.DataTableAdapter;
import org.Base.Container.myListViewTitle;
import org.Base.Webservice.WSObjectListUtil;
import org.Base.Webservice.WSObjectMapUtil;
import org.Base.Webservice.WSObjectUtil;
import org.Base.Webservice.WSUtil;
import org.Base.Webservice.WebServiceConfig;
import org.DigitalCM.R;
import org.ksoap2.serialization.SoapObject;

import android.app.AlertDialog;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class PagedQueryResultHelper {
	private final static int initialFromRecordNum = 1;//每页从第1条开始
	private final static int initialToRecordNum = 20;//每页可以显示20条

	public PagedQueryResultHelper(QueryContextActivity contextActivity) {//构造函数用来初始化,主要是用来接收传过来的activity做为上下文对象
		this.contextActivity = contextActivity;

		findViews();//调用此方法找到传过来的activity的控件对象
		setOnClickListener();//给控件设置监听
		if (currentPageText != null) {//如果所有页面只有一页,那就只显示一页
			setCurrentPage(1);
		}
	}

	public List<List<String>> initialQuery() {
		setRecordNumEachPage(initialToRecordNum - initialFromRecordNum + 1);//设置每页的记录条数
		return query(initialFromRecordNum, initialToRecordNum);

	}

	public List<List<String>> initialQuery01() {
		return query(methodName, params);
	}

	private void setCurrentPage(int currentPage) {//设置当前页
		this.currentPage = currentPage;
		currentPageText.setText(String.valueOf(currentPage));
	}

	public void setMarkable(boolean bMarkable) {//这个是用来标记记录的
		this.bMarkable = bMarkable;
	}

	public void setRecordNumEachPage(int recordNumEachPage) {);//设置每页的记录条数
		this.recordNumEachPage = recordNumEachPage;
		recordNumEachPageText.setText(String.valueOf(recordNumEachPage));
	}

	public void setTotalRecord(int totalRecord) {//设置总记录数
		this.totalRecord = totalRecord;
		totalRecordNumText.setText(String.valueOf(totalRecord));
		getTotalPageNumText();
	}

	private QueryContextActivity contextActivity;
	private TextView totalPageNumText;
	private TextView totalRecordNumText;
	private TextView recordNumEachPageText;
	private Button firstPage;
	private Button pageDown;
	private Button pageUp;
	private Button lastPage;
	private EditText currentPageText;
	private Button toPage;

	private int totalPage;
	private int totalRecord;
	private int recordNumEachPage;
	private int currentPage;
	private String fromRecordNumField;
	private String toRecordNumField;
	private String methodName;
	private Map<String, Object> params;
	private String contentTableName;
	// private String countTableName;
	private int headerNameId;
	private int headerId;
	private List<Integer> columnWidths = null;
	private boolean bSetTitleValue = false;
	private List<Map<String, Object>> wholeresult = null;
	private List<List<String>> rows = null;
	private boolean bMarkable = false;
	private DataTableAdapter dataTableAdapter;

	public void setQueryParams(String methodName, Map<String, Object> params,
			String fromRecordNumField, String toRecordNumField,
			String contentTableName, int headerNameId, int headerId) {
		this.methodName = methodName;
		this.params = params;
		this.fromRecordNumField = fromRecordNumField;
		this.toRecordNumField = toRecordNumField;
		this.contentTableName = contentTableName;
		// this.countTableName = countTableName;
		this.headerNameId = headerNameId;
		this.headerId = headerId;
	}

	public void setQueryParams(String methodName, Map<String, Object> params,
			String fromRecordNumField, String toRecordNumField,
			String contentTableName) {
		this.methodName = methodName;
		this.params = params;
		this.fromRecordNumField = fromRecordNumField;
		this.toRecordNumField = toRecordNumField;
		this.contentTableName = contentTableName;
		// this.countTableName = countTableName;

	}

	public void setQueryParams(String methodName, Map<String, Object> params,
			String contentTableName, int headerNameId, int headerId) {
		this.methodName = methodName;
		this.params = params;

		this.contentTableName = contentTableName;

		this.headerNameId = headerNameId;
		this.headerId = headerId;

	}

	public void setTitleCellWidth(List<Integer> columnWidths) {
		this.columnWidths = columnWidths;
	}

	/*
	 * public int getCurrentPage(){ return currentPage; }
	 */

	private void findViews() {
		totalPageNumText = (TextView) contextActivity
				.findViewById(R.id.total_page_num);
		totalRecordNumText = (TextView) contextActivity
				.findViewById(R.id.total_record_num);
		recordNumEachPageText = (TextView) contextActivity
				.findViewById(R.id.record_num_each_page);
		firstPage = (Button) contextActivity.findViewById(R.id.first_page);
		pageDown = (Button) contextActivity.findViewById(R.id.page_down);
		pageUp = (Button) contextActivity.findViewById(R.id.page_up);
		lastPage = (Button) contextActivity.findViewById(R.id.last_page);
		currentPageText = (EditText) contextActivity
				.findViewById(R.id.current_page);
		toPage = (Button) contextActivity.findViewById(R.id.to_page);
	}

	private void setOnClickListener() {
		if (firstPage != null) {
			firstPage.setOnClickListener(contextActivity);
		}
		if (pageDown != null) {
			pageDown.setOnClickListener(contextActivity);
		}
		if (pageUp != null) {
			pageUp.setOnClickListener(contextActivity);
		}
		if (lastPage != null) {
			lastPage.setOnClickListener(contextActivity);
		}
		if (toPage != null) {
			toPage.setOnClickListener(contextActivity);
		}
	}

	private void getRecordNumEachPageText() {
		try {
			recordNumEachPage = Integer.parseInt(recordNumEachPageText
					.getText().toString());
		} catch (NumberFormatException e) {
			Log.e("NumberFormatException", e.getMessage());
		}
	}

	private boolean outOfEachPageRange() {
		recordNumEachPage = Integer.parseInt(recordNumEachPageText.getText()
				.toString());
		if (recordNumEachPage > 20 || recordNumEachPage < 1) {
			return true;
		}
		return false;
	}

	private void getTotalPageNumText() {
		getRecordNumEachPageText();
		if (recordNumEachPage == 0)
			return;
		if (totalRecord == 0) {
			totalPage = 0;
			totalPageNumText.setText(String.valueOf(0));
			return;
		}
		if (totalRecord % recordNumEachPage == 0) {//java中分页常用到的计算公式
			totalPage = totalRecord / recordNumEachPage;
		} else {
			totalPage = totalRecord / recordNumEachPage + 1;
		}
		totalPageNumText.setText(String.valueOf(totalPage));
	}

	public void pageDown() {
		if (outOfEachPageRange()) {
			AlertDialog.Builder dialog = new AlertDialog.Builder(
					contextActivity);
			dialog.setTitle("提示:").setMessage("每页显示条数在1~20之间!")
					.setPositiveButton("确认", null).show();
			return;
		}
		if (currentPage != totalPage) {
			setCurrentPage(++currentPage);
			getTotalPageNumText();
			query(recordNumEachPage * (currentPage - 1) + 1, recordNumEachPage
					* currentPage);
		}
	}

	public void pageUp() {
		if (outOfEachPageRange()) {
			AlertDialog.Builder dialog = new AlertDialog.Builder(
					contextActivity);
			dialog.setTitle("提示:").setMessage("每页显示条数在1~20之间!")
					.setPositiveButton("确认", null).show();
			return;
		}
		if (currentPage != 1 && currentPage != 0) {
			setCurrentPage(--currentPage);
			getTotalPageNumText();
			query(recordNumEachPage * (currentPage - 1) + 1, recordNumEachPage
					* currentPage);
		}
	}

	public void firstPage() {
		if (outOfEachPageRange()) {
			AlertDialog.Builder dialog = new AlertDialog.Builder(
					contextActivity);
			dialog.setTitle("提示:").setMessage("每页显示条数在1~20之间!")
					.setPositiveButton("确认", null).show();
			return;
		}
		getTotalPageNumText();
		if (totalPage > 1) {
			setCurrentPage(1);
			query(1, recordNumEachPage);
		}
	}

	public void lastPage() {
		if (outOfEachPageRange()) {
			AlertDialog.Builder dialog = new AlertDialog.Builder(
					contextActivity);
			dialog.setTitle("提示:").setMessage("每页显示条数在1~20之间!")
					.setPositiveButton("确认", null).show();
			return;
		}
		getTotalPageNumText();
		if (totalPage != 1 && totalPage != 0) {
			setCurrentPage(totalPage);
			query(recordNumEachPage * (totalPage - 1) + 1, totalRecord);
		}
	}

	public void toPage() {
		if (outOfEachPageRange()) {
			AlertDialog.Builder dialog = new AlertDialog.Builder(
					contextActivity);
			dialog.setTitle("提示:").setMessage("每页显示条数在1~20之间!")
					.setPositiveButton("确认", null).show();
			return;
		}
		try {
			currentPage = Integer
					.parseInt(currentPageText.getText().toString());
		} catch (NumberFormatException e) {
			Log.e("NumberFormatException", e.getMessage());
			return;
		}
		getTotalPageNumText();
		query(recordNumEachPage * (currentPage - 1) + 1, recordNumEachPage
				* currentPage);
		currentPageText.setText(String.valueOf(currentPage));
	}

	public List<List<String>> query(int fromRecordNum, int toRecordNum) {
		return query(methodName, params, fromRecordNumField, toRecordNumField,
				fromRecordNum, toRecordNum);
	}

	private List<List<String>> query(String methodName,
			Map<String, Object> params, String fromRecordNumField,
			String toRecordNumField, int fromRecordNum, int toRecordNum) {
		params.put(fromRecordNumField, fromRecordNum);
		params.put(toRecordNumField, toRecordNum);

		return query(methodName, params);
	}

	public List<Map<String, Object>> getWholeResult() {
		return wholeresult;
	}

	public List<Map<String, Object>> getResult() {
		return wholeresult;
	}

	public List<Boolean> getCheckBoxState() {
		return dataTableAdapter.getCheckBoxState();
	}

	public List<List<String>> query(String methodName,
			Map<String, Object> params) {//此方法要重点注意,因为这里是根据webservice查询到的数据,所以要传递来方法和参数
		SoapObject result = null;

		if (methodName == null) {
			if (bSetTitleValue == false) {//下面是实现listview的标题显示
				bSetTitleValue = true;
				myListViewTitle listViewTitle = new myListViewTitle(
						contextActivity);
				if (this.columnWidths != null) {
					listViewTitle.setTitleCellWidth(this.columnWidths);
				}
				List<String> headerList = Arrays.asList(contextActivity
						.getResources().getStringArray(headerId));
				listViewTitle.setTitleCellValue(headerList);
			}
			return null;
		}

		try {
			result = WSUtil.getSoapObjectByCallingWS(//这里是android调用webservice的典型方法
					WebServiceConfig.NAMESPACE, methodName, params,
					WebServiceConfig.wsdl);
		} catch (Exception e) {
			new AlertDialog.Builder(contextActivity)
					.setTitle(R.string.message_title)
					.setMessage(R.string.connection_error)
					.setPositiveButton(R.string.OK_text, null).show();
			Log.e("Exception", e.getMessage());
		}

		if (result == null) {//如果从webservice得到的结果为null,那我们就找到listview,并赋空值,将分页的显示值设为0
			ListView list = (ListView) contextActivity.findViewById(R.id.list);
			list.setAdapter(null);
			setTotalRecord(0);
			this.setCurrentPage(0);
			return null;
		}

		SoapObject dataSet = WSObjectUtil.getDataSetObject(result);//如果从webservice得到的结果不为空,则转化成dataSet  		
               if (dataSet == null) {//如果dataSet为空,则显示对话框,没有查询到相关数据			
                              new AlertDialog.Builder(contextActivity)
					.setTitle(R.string.message_title).setMessage("没有查询到相关数据!")
					.setPositiveButton(R.string.OK_text, null);

			return null;
		}
// 否则,就取得列名,并将取得的dataset转化成list型的数据,最后将数据显示在listview,并通过rows返回数据	
     List<String> columnNameList = Arrays.asList(contextActivity
				.getResources().getStringArray(headerNameId));
		WSObjectListUtil wsObjectListUtil = new WSObjectListUtil();
		if (contentTableName != null) {
			rows = wsObjectListUtil.getTableValueList(dataSet,
					contentTableName, columnNameList);
		} else {
			rows = wsObjectListUtil.getTableValueList(dataSet, columnNameList);
		}
		if (wholeresult != null) {
			wholeresult.clear();
		}
		WSObjectMapUtil wsObjectMapUtil = new WSObjectMapUtil();
		if (contentTableName != null) {
			wholeresult = wsObjectMapUtil.getRowMapList(contentTableName,
					dataSet);
		} else {
			wholeresult = WSObjectMapUtil.getRowMapList(dataSet);
		}
		SoapObject countTable = (SoapObject) dataSet.getProperty(dataSet
				.getPropertyCount() - 1);
		try {
			totalRecord = Integer
					.parseInt(countTable.getProperty(0).toString());
		} catch (Exception e) {
			Log.e("Exception", e.getMessage());
		}
		if (totalRecord != 0 && this.totalRecord == 0
				&& currentPageText != null) {
			this.setCurrentPage(1);
		}
		setTotalRecord(totalRecord);

		if (bSetTitleValue == false) {
			bSetTitleValue = true;
			myListViewTitle listViewTitle = new myListViewTitle(contextActivity);
			if (this.columnWidths != null) {
				listViewTitle.setTitleCellWidth(this.columnWidths);
			}
			List<String> headerList = Arrays.asList(contextActivity
					.getResources().getStringArray(headerId));
			listViewTitle.setTitleCellValue(headerList);
		}

		ListView list = (ListView) contextActivity.findViewById(R.id.list);
		dataTableAdapter = new DataTableAdapter(contextActivity, rows);
		if (bMarkable) {
			dataTableAdapter.setMarkable(true);
		}
		if (this.columnWidths != null) {
			dataTableAdapter.setColumnWidths(this.columnWidths);
		}
		list.setAdapter(dataTableAdapter);//注意,关键点:将数据显示在listview

		return rows;//返回数据
	}
}
好的,这个工具类基本就实现了。大家也可以自己添加一些元素完善。







评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值