转载自:http://blog.csdn.net/shaojie519/article/details/6624895


ListView就是可以显示一行行Item的控件,有时候数据非常多,通常需要分页显示,但为了减少用户的输入,我们可以动态更新ListView,把下一页要显示的数据的添加到当前ListView中。具体效果如下:



需要注意的是在什么时候去更新数据 ,listVIew的setOnScrollListener监听是否滚到了最后一条记录,

取到的数据加到list中,最后记得调用adapter的notifyDataSetChanged,通知listview改变。代码如下:


主文件:

[java] view plaincopy

  1. import java.util.ArrayList;  

  2. import java.util.List;  

  3.   

  4. import android.app.Activity;  

  5. import android.os.AsyncTask;  

  6. import android.os.Bundle;  

  7. import android.widget.AbsListView;  

  8. import android.widget.AbsListView.OnScrollListener;  

  9. import android.widget.ListView;  

  10. import android.widget.Toast;  

  11.   

  12. public class ListViewActivity extends Activity {  

  13.     private ListView listView;  

  14.     //定义适配器  

  15.     private ListItemAdapter listadpter;  

  16.     //定义每一页显示行数  

  17.     private int VIEW_COUNT = 20;  

  18.     //定义的页数  

  19.     private int index = 0;  

  20.     //当前页  

  21.     private int currentPage = 1;  

  22.     //所以数据的条数  

  23.     private int totalCount;  

  24.     //每次取的数据,只要最后一次可能不一样。  

  25.     private int maxResult;  

  26.     //泛型集合ArrayList  

  27.     private ArrayList arrayList = new ArrayList();  

  28.     //数据操作的dao类  

  29.     StudentsDAO dao = new StudentsDAO(ListViewActivity.this);  

  30.     //实体bean  

  31.     Students students = new Students();  

  32.     // 标记:上次的ID  

  33.       

  34.     private boolean isUpdating = false;  

  35.     /** Called when the activity is first created. */  

  36.     @Override  

  37.     public void onCreate(Bundle savedInstanceState) {  

  38.         super.onCreate(savedInstanceState);  

  39.         setContentView(R.layout.main);  

  40.         //初始化界面  

  41.         initView();  

  42.         //插入100条记录。  

  43.         dao.insert();  

  44.         totalCount  = dao.getCount();  

  45.         maxResult = getMaxResult();  

  46.         //调用dao里面的selectAll()方法  

  47.         arrayList = dao.getAllItems(index, maxResult);  

  48.         //实例化适配器  

  49.         System.out.println("arrlist-->"+arrayList.size());  

  50.         listadpter = new ListItemAdapter(ListViewActivity.this,arrayList);  

  51.         //填充适配器  

  52.         listView.setAdapter(listadpter);  

  53.                   

  54.         listView.setOnScrollListener(new OnScrollListener() {  

  55.               

  56.             @Override  

  57.             public void onScrollStateChanged(AbsListView view, int scrollState) {  

  58.                   

  59.             }  

  60.               

  61.             @Override  

  62.             public void onScroll(AbsListView view, int firstVisibleItem,  

  63.                     int visibleItemCount, int totalItemCount) {  

  64.                 if(firstVisibleItem + visibleItemCount == totalItemCount && !isUpdating){  

  65.                     if(totalItemCount//防止最后一次取数据进入死循环。  

  66.                         Toast.makeText(ListViewActivity.this"正在取第"+(++currentPage)+"的数据", Toast.LENGTH_LONG).show();  

  67.                     AsyncUpdateDatasTask asyncUpdateWeiBoDatasTask = new AsyncUpdateDatasTask();  

  68.                     asyncUpdateWeiBoDatasTask.execute();  

  69.                     }  

  70.                     System.out.println("begin update-------------");  

  71.                 }  

  72.             }  

  73.         });  

  74.     }  

  75.     //初始化界面方法  

  76.     private void initView() {  

  77.         // TODO Auto-generated method stub  

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

  79.     }  

  80.     class AsyncUpdateDatasTask  extends AsyncTask> {  

  81.   

  82.         @Override  

  83.         protected List doInBackground(Void... params) {  

  84.             // TODO Auto-generated method stub  

  85.             isUpdating = true;  

  86.             index += VIEW_COUNT;  

  87.             List list =new ArrayList();  

  88.             list = dao.getAllItems(index, maxResult);  

  89.             return list;  

  90.         }  

  91.         @Override  

  92.         protected void onPostExecute(List result) {  

  93.             // TODO Auto-generated method stub  

  94.             super.onPostExecute(result);  

  95.             arrayList.addAll(result);  

  96.             listadpter.notifyDataSetChanged();  

  97.             isUpdating = false;  

  98.             System.out.println("end update--------------");  

  99.         }  

  100.     }  

  101.    private int getMaxResult(){  

  102.        int totalPage = (totalCount+VIEW_COUNT-1)/VIEW_COUNT;  

  103.           return  totalCount-(totalPage-1)*VIEW_COUNT;  

  104.    }  

  105. }  


数据库Dao文件:



[java] view plaincopy

  1. package com.shao.list;  

  2.   

  3.   

  4. import java.util.ArrayList;  

  5. import java.util.Random;  

  6.   

  7. import android.content.ContentValues;  

  8. import android.content.Context;  

  9. import android.database.Cursor;  

  10. import android.database.sqlite.SQLiteDatabase;  

  11. import android.database.sqlite.SQLiteOpenHelper;  

  12.   

  13. public class StudentsDAO extends SQLiteOpenHelper {  

  14.   

  15.     private final static String AUDIODATABASE_NAME = "student.db";  

  16.     private final static String TABLE = "student";  

  17.     private final static String COLUM_ID = "id";  

  18.     private final static String COLUM_NAME = "name";  

  19.     private final static String COLUM_AGE = "age";  

  20.     private final static int DATABASE_VERSION = 1;  

  21.     private long row;  

  22.     private ArrayList arrayList;  

  23.   

  24.     public StudentsDAO(Context context) {  

  25.         super(context, AUDIODATABASE_NAME, null, DATABASE_VERSION);  

  26.         // TODO Auto-generated constructor stub  

  27.     }  

  28.   

  29.     @Override  

  30.     public void onCreate(SQLiteDatabase db) {  

  31.         // TODO Auto-generated method stub  

  32.         String sql = "CREATE TABLE " + TABLE + " (" + COLUM_ID  

  33.                 + " INTEGER primary key autoincrement, " + " " + COLUM_NAME  

  34.                 + " text, " + " " + COLUM_AGE + " int)";  

  35.         db.execSQL(sql);  

  36.     }  

  37.   

  38.     @Override  

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

  40.         // TODO Auto-generated method stub  

  41.         String sql = "DROP TABLE IF EXISTS " + TABLE;  

  42.         db.execSQL(sql);  

  43.     }  

  44.   

  45.     public long insert() {  

  46.         SQLiteDatabase db = getWritableDatabase();  

  47.         ContentValues cv = new ContentValues();  

  48.         Random random = new Random();  

  49.         for(int i=1;i<=100;i++)  

  50.         {  

  51.             cv.put(COLUM_ID, i);  

  52.             cv.put(COLUM_NAME, "name"+String.valueOf(i));  

  53.             cv.put(COLUM_AGE, random.nextInt(100));  

  54.             row = db.insert(TABLE, null, cv);  

  55.         }  

  56.         db.close();  

  57.         return row;  

  58.     }  

  59.     //查询记录的总数  

  60.         public int getCount() {  

  61.             SQLiteDatabase db = getWritableDatabase();  

  62.              String sql = "select count(*) from '"+TABLE+"'";  

  63.             Cursor c = db.rawQuery(sql, null);  

  64.             c.moveToFirst();  

  65.             int length = c.getInt(0);  

  66.           c.close();  

  67.          db.close();  

  68.         // System.out.println("length-->"+length);  

  69.             return length;  

  70.      }  

  71.         public  ArrayList getAllItems(int firstResult, int maxResult) {  

  72.                arrayList=new ArrayList();  

  73.                  SQLiteDatabase db = getWritableDatabase();  

  74.                 String sql = "select * from '"+TABLE+"' limit ?,?";  

  75.                  Cursor cursor = db.rawQuery(sql, new String[]{String.valueOf(firstResult), String.valueOf(maxResult)});  

  76.                  if (cursor != null && cursor.getCount() > 0) {  

  77.                         cursor.moveToFirst();  

  78.                     }  

  79.                     for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {  

  80.                         Students students=new Students();  

  81.                         students.setId(cursor.getInt(0));  

  82.                         students.setName(cursor.getString(1));  

  83.                         students.setAge(cursor.getInt(2));  

  84.                         arrayList.add(students);  

  85.                     }  

  86.                     cursor.close();  

  87.                     db.close();  

  88.                     return arrayList;  

  89.             }  

  90.           

  91.     public ArrayList selectAll() {  

  92.         arrayList=new ArrayList();  

  93.         SQLiteDatabase db = this.getWritableDatabase();  

  94.         Cursor cursor = db.query(TABLE, nullnullnullnullnullnull);  

  95.         if (cursor != null && cursor.getCount() > 0) {  

  96.             cursor.moveToFirst();  

  97.         }  

  98.         for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {  

  99.             Students students=new Students();  

  100.             students.setId(cursor.getInt(0));  

  101.             students.setName(cursor.getString(1));  

  102.             students.setAge(cursor.getInt(2));  

  103.             arrayList.add(students);  

  104.         }  

  105.         cursor.close();  

  106.         db.close();  

  107.         return arrayList;  

  108.           

  109.     }  

  110.   

  111. }