原文地址: http://hddev.blog.51cto.com/3365350/651517
- //加载数据的方法
- private void fillAdapter(int count, int begin) {
- // TODO Auto-generated method stub
- SQLiteOpenHelper mSQLiteOpenHelper = new SQLiteOpenHelper (
- this);
- Cursor c= mSQLiteOpenHelper .getDynamicListViewData(count, offset);
- }
- //监听listview的onScroll方法
- OnScrollListener listScroll = new OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- // TODO Auto-generated method stub
- }
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem,
- int visibleItemCount, int totalItemCount) {
- if(isLoading) //正在加载时就不要让在执行活动触发事件
- return;
- if (firstVisibleItem + visibleItemCount == totalItemCount) {
- // 开线程去获取数据
- if (totalItemCount <= totalItemsCount) {
- Integer[] params = new Integer[] { 25, currentItemCount };
- mAsynchTask = new AsynchTask();
- mAsynchTask.execute(params);
- } else {
- Toast.makeText(EventTracker.this, "there is no data!",
- Toast.LENGTH_SHORT).show();
- }
- }
- }
- };
- //通过AsyncTask更方便的实现多线程管理,使得加载效果更平滑
- private class AsynchTask extends AsyncTask<Integer, Void, Void> {
- @Override
- /**将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。
- * 这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法
- * 来更新实时的任务进度。该方法是抽象方法,子类必须实现。 */
- protected Void doInBackground(Integer... params) {
- fillAdapter(params[0], params[1]);
- return null;
- }
- @Override
- /** 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,
- * 后台的计算结果将通过该方法传递到UI thread.
- * */
- protected void onPreExecute() {
- //loadingView为自定义的一个dialog,用于提示用户正在加载
- mEventListView.addFooterView(loadingView);
- isLoading=true;
- }
- @Override
- /** 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,
- * 后台的计算结果将通过该方法传递到UI thread.
- * */
- protected void onPostExecute(Void result) {
- bindAdapter();
- mListView.removeFooterView(loadingView);
- mListView.setSelection(currentItemCount);
- currentItemCount += 25;//每次加载25列,偏移量也递增25
- isLoading=false;
- }
- }
- 数据库中方法如下:
- public Cursor getDynamicListViewData(int count, int offset) {
- return getReadableDatabase().rawQuery(
- "select * from TableName limit " + count + "offset" + offset,
- null);
- }