ListView滑动分页,并加载部分数据

来源:互联网 发布:ubuntu vim保存退出 编辑:程序博客网 时间:2024/05/01 00:13



 

 

 

由于要使用SimpleAdapter,所以要新建一个布局文件tab_info.xml

 

<?xml version="1.0" encoding="utf-8"?>

<TableLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:id="@+id/mylayout"

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent">

  <TableRow>

     <TextView

       android:id="@+id/id"

       android:textSize="30px"

       android:layout_height="wrap_content"

       android:layout_width="50px"/>

     <TextView

       android:id="@+id/name"

       android:textSize="30px"

       android:layout_height="wrap_content"

       android:layout_width="130px"/>

     <TextView

       android:id="@+id/birthday"

       android:textSize="30px"

       android:layout_height="wrap_content"

       android:layout_width="180px"/>

  </TableRow>

</TableLayout>

 

 

 

 

在main.xml中:

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

  xmlns:android="http://schemas.android.com/apk/res/android"

  android:id="@+id/mylayout"

  android:orientation="vertical"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent">

</LinearLayout>

 

 

 

 

在MySQLiteDemo.java中

 

package com.li.sqlite;

 

import java.util.List;

import java.util.Map;

 

import android.app.Activity;

import android.database.sqlite.SQLiteOpenHelper;

import android.os.Bundle;

import android.view.Gravity;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.LinearLayout;

import android.widget.LinearLayout.LayoutParams;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

 

public class MySQLiteDemo extends Activity {

  private ListView listView ;

  private SimpleAdapter simpleAdapter = null ;

  private LinearLayout loadLayout = null ;  // 读取的脚标的视图

  private TextView loadInfo = null ; // 进行信息提示

  private List<Map<String,Object>> all = null ;

  private LayoutParams layoutParams = new LinearLayout.LayoutParams(

       LinearLayout.LayoutParams.FILL_PARENT,

       LinearLayout.LayoutParams.WRAP_CONTENT);  // 表示新组件的布局参数

  private SQLiteOpenHelper helper = null ;

  private LinearLayout mylayout = null ;

  private int currentPage = 1 ;

  private int lineSize = 15 ;

  private int allRecorders = 0 ;

  private int pageSize = 1 ;  // 默认在一共只有1页

  private int lastItem = 0 ;  // 保存最后一项

  @Override

  public void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

     super.setContentView(R.layout.main);

     this.mylayout = (LinearLayout) super.findViewById(R.id.mylayout) ;

     this.loadLayout = new LinearLayout(this) ;  // 定义脚标的线性布局管理器

     this.loadInfo = new TextView(this) ; // 文本组件

     this.loadInfo.setText("数据加载中ing...") ;  // 定义提示文字

     this.loadInfo.setGravity(Gravity.CENTER) ;  // 文字居中显示

     this.loadInfo.setTextSize(30.0f) ; // 文字大小

     this.loadLayout.addView(this.loadInfo,this.layoutParams) ;  // 增加组件

     this.loadLayout.setGravity(Gravity.CENTER) ;

     this.showAllData() ; // 数据显示

     this.pageSize = (this.allRecorders + this.lineSize - 1)

         / this.lineSize; // 计算总页数

     System.out.println("pageSize = " + this.pageSize) ;

     System.out.println("allRecorders = " + this.allRecorders);

  }

  private void showAllData(){ // 读取全部的数据

     MySQLiteDemo.this.helper = new MyDatabaseHelper(MySQLiteDemo.this);

     MytabCursor cur = new MytabCursor( // 实例化查询

         MySQLiteDemo.this.helper.getReadableDatabase()) ;  // 取得SQLiteDatabase对象

     this.allRecorders = cur.getCount() ; // 取得全部记录数

     this.listView = new ListView(MySQLiteDemo.this) ;

     MySQLiteDemo.this.all = cur.find(MySQLiteDemo.this.currentPage,MySQLiteDemo.this.lineSize) ;

     this.listView.addFooterView(this.loadLayout) ; // 增加读取数据的布局文件

     this.simpleAdapter = new SimpleAdapter(MySQLiteDemo.this,   // 上下文对象

         MySQLiteDemo.this.all,      // 所有要操作的数据

         R.layout.tab_info,        // 布局管理器

         new String[] { "id", "name", "birthday" },  // map中的key

         new int[] { R.id.id, R.id.name, R.id.birthday }) ;

     this.listView.setAdapter(this.simpleAdapter);  // 布局管理中的id

     this.listView.setOnScrollListener(new OnScrollListenerImpl()) ;

     this.mylayout.addView(listView) ;

  }

  private class OnScrollListenerImpl implements OnScrollListener{

 

     public void onScroll(AbsListView view, int firstVisibleItem,

         int visibleItemCount, int totalItemCount) {

       MySQLiteDemo.this.lastItem = firstVisibleItem + visibleItemCount - 1 ; // 统计是否到最后

     }

 

     public void onScrollStateChanged(AbsListView view, int scrollState) {

       if (MySQLiteDemo.this.lastItem == MySQLiteDemo.this.simpleAdapter

            .getCount()// 已经是最底部

            && MySQLiteDemo.this.currentPage < MySQLiteDemo.this.pageSize // 还有数据没读取完

           && scrollState == OnScrollListener.SCROLL_STATE_IDLE ) { // 不再滑动

         MySQLiteDemo.this.currentPage ++ ;

         MySQLiteDemo.this.listView.setSelection(MySQLiteDemo.this.lastItem) ; // 设置显示位置

         MySQLiteDemo.this.appendData() ; // 增加数据

       }

     }

    

  }

 

  private void appendData(){  // 增加数据

     MytabCursor cur = new MytabCursor( // 实例化查询

         MySQLiteDemo.this.helper.getReadableDatabase()) ;  // 取得SQLiteDatabase对象

     List<Map<String, Object>> newData = cur.find(this.currentPage,

         this.lineSize);

     this.all.addAll(newData) ;  // 集合改变

     this.simpleAdapter.notifyDataSetChanged() ; // 通知记录改变

  }

}

 

 

 

 

在MytabCursor.java中

 

package com.li.sqlite;

 

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

 

public class MytabCursor {

  private static final String TABLENAME = "mytab" ;

  private SQLiteDatabase db = null ;

  public MytabCursor(SQLiteDatabase db) {

     this.db = db ;

  }

 

  public int getCount() { // 返回记录数

     int count = 0;

     String sql = "SELECT COUNT(id) FROM " + TABLENAME; // 查询SQL

     Cursor result = this.db.rawQuery(sql, null);

     for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { // 采用循环的方式检索数据

       count = result.getInt(0);

     }

     return count;

  }

 

  public List<Map<String,Object>> find(int currentPage,int lineSize){

     List<Map<String,Object>> all = new ArrayList<Map<String,Object>>() ;

     String sql = "SELECT id,name,birthday FROM " + TABLENAME

         + " LIMIT ?,?";

     String args[] = new String[] {

         String.valueOf((currentPage - 1) * lineSize),

         String.valueOf(lineSize) }; // 是设置参数

     Cursor result = this.db.rawQuery(sql, args); // 执行查询语句

     for (result.moveToFirst(); !result.isAfterLast(); result.moveToNext()) { // 采用循环的方式检索数据

       Map<String,Object> map = new HashMap<String,Object>() ;

       map.put("id", result.getInt(0)) ;

       map.put("name", result.getString(1)) ;

       map.put("birthday",result.getString(2)) ;

       all.add(map) ;

     }

     this.db.close() ;

     return all ;

  }

 

}

 

 

 

 

 

 

 

在MyDatabaseHelper.java中

 

package com.li.sqlite;

//数据库的辅助操作类

import android.content.Context;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

 

public class MyDatabaseHelper extends SQLiteOpenHelper {

  private static final String DATABASENAME = "liyewen.db" ;

  private static final int DATABASERVERSION = 1 ;  // 设置数据库的版本

  private static final String TABLENAME = "mytab" ;

 

  public MyDatabaseHelper(Context context) {  // 用户最关心的也肯定只是Context

     super(context, DATABASENAME, null, DATABASERVERSION);

  }

 

  @Override

  public void onCreate(SQLiteDatabase db) { // 创建数据表

     String sql = "CREATE TABLE " + TABLENAME + "("

         + "id    INTEGER       PRIMARY KEY ,"   // 在SQLite中设置为Integer、PRIMARY KEY则ID自动增长

         + "name   VARCHAR(50)   NOT NULL ,"

         + "birthday DATE NOT    NULL" + ")";

     db.execSQL(sql) ;  // 执行SQL

     System.out.println("****************** 创建:onCreate()。");

  }

 

  @Override

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

     String sql = "DROP TABLE IF EXISTS " + TABLENAME ;

     db.execSQL(sql) ;

     System.out.println("****************** 更新:onUpgrade()。");

     this.onCreate(db) ;

  }

 

}

 

原创粉丝点击