原文地址: 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);
- }