2012-01-15 28 views
1

我想用SimpleCursorAdapter在列表視圖中顯示從數據庫查詢的項目。 例如,數據庫中可能有20,000個項目。我只想加載100個物品(_id:1-100)查詢而不是加載所有物品,當滾動到listview結尾時,加載另外100個物品(_id:101-200)查詢,如何實現呢?歡迎任何建議,謝謝。如何通過SimpleCursorAdapter更新從數據庫查詢其數據的listview?

相對代碼如下:

protected void onCreate(Bundle savedInstanceState) { 
    mCursor = managedQuery(CONTENT_URI, PROJECTION, null, null, "_id DESC"); 
    mAdapter = new SimpleCursorAdapter(this,R.layout.list_content, mCursor, keys, values); 
    setListAdapter(mAdapter); 
} 

在我的定義列表視圖,我想通過加載數據庫查詢更多的項目。

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
{ 
    int lastItem = firstVisibleItem + visibleItemCount - 1; 

    if (mListAdapter != null) { 
     if ((lastItem == mListAdapter.getCount()-1) && (mRefreshState != REFRESHING)) { 
      mFooterView.setVisibility(View.VISIBLE); 
      mRefreshState = REFRESHING; 
      new Handler().postDelayed(new Runnable() { 
       public void run() { 
        //execute the task , i want to load more items by query database 
        RefreshListView(LOADING_STORED_INFO);           
       } 
      }, DEFAULT_DELAY_TIMER);   
     } 
    } 
} 

在AsyncTask加載數據中,我執行查詢操作。

protected Integer doInBackground(Integer... params) 
    { 
     Uri uri = ContentUris.withAppendedId(CONTENT_URI, mCursor.getInt(0)-1); 
     cursor = managedQuery(uri, PROJECTION, null, null, "_id DESC"); 
     return (0 == params[0]) ? 1 : 0; 
    } 

    @Override 
    protected void onPostExecute(Integer result) 
    { 
     mAdapter.changeCursor(cursor);//is this OK? 
     mAdapter.notifyDataSetChanged(); 
     /* 
     if (1 == result) 
     { 
      mListView.setSelection(1); 
     } 
     else 
     { 
      mListView.setSelection(mCount-1);    
     }*/ 
     // Call onRefreshComplete when the list has been refreshed. 
     mListView.onRefreshComplete(result); 
     super.onPostExecute(result); 
    } 
+0

相對代碼如下: – breeze 2012-01-15 13:00:05

回答

2

使用LIMIT語句在SQL查詢中這樣說:

SELECT your_column FROM your_table ORDER BY your_order LIMIT limit_skip, limit_count 

然後你可以使用一個OnScrollListener檢索第一個可見單元的索引和可見單元格,使您可以數連貫地增加limit_skiplimit_count

取而代之的是通用AsyncTask使用CursorLoader和實施LoaderManager.LoaderCallbacks<Cursor>如下:

public Loader<Cursor> onCreateLoader(int id, Bundle args){ 
    String orderBy = "_id DESC" 
    if(args != null){ 
     orderBy += " LIMIT " + args.getInt("LIMIT_SKIP") + "," + args.getInt("LIMIT_COUNT"); 
    } 

    return new CursorLoader(this /*context*/, CONTENT_URI, PROJECTION, null, null, orderBy); 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor data){ 
    listAdapter.swapCursor(data); 
} 

public void onLoaderReset(Loader<Cursor> loader){ 
    listAdapter.swapCursor(null); 
} 

然後,在onCreate(),通過nullcursornew SimpleCursorAdapter()並以這種方式創建CursorLoader

getLoaderManager().initLoader(0, null, this /*LoaderCallbacks<Cursor>*/); 

然後,在onScroll()中,每次以這種方式重置加載程序:

Bundle args = new Bundle(); 
args.putInt("LIMIT_SKIP", limit_skip_value); 
args.putInt("LIMIT_COUNT", limit_count_value); 
getLoaderManager().restartLoader(0, args, this /*LoaderCallbacks<Cursor>*/); 
+0

我用的ContentProvider的查詢功能,而不是UE的SQL查詢。我的問題是如何更改光標以確保listview項的計數在查詢更多items時增加。我使用changeCursor和notifyDataSetChanged函數,但沒有用。 – breeze 2012-01-15 10:18:56

+0

請編輯您的問題並添加您的代碼,以便我們能夠更好地爲您提供幫助。 – 2012-01-15 10:33:33

+0

謝謝,我已經添加了有關代碼的問題。 – breeze 2012-01-15 13:21:47

相關問題