2012-01-15 9 views
1

SimpleCursorAdapter를 사용하여 데이터베이스에서 쿼리 된 항목을 목록보기에 표시하려고합니다. 예를 들어 데이터베이스에 20,000 개의 항목이있을 수 있습니다. 나는 100 개 항목 (_id : 1-100)을로드하고 싶습니다. 목록보기 끝에서 스크롤 할 때 다른 항목 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에서 쿼리 작업을 수행합니다.

SELECT your_column FROM your_table ORDER BY your_order LIMIT limit_skip, limit_count 

이 그럼 당신은 최초의 가시 셀의 인덱스와 눈에 보이는 세포의 수는 수를 검색 OnScrollListener를 사용할 수 있습니다

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

답변

2

이 방법으로 SQL 쿼리에 LIMIT 문을 사용하여 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()에, new SimpleCursorAdapter()cursornull을 통과하고 이런 식으로 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

uesql query 대신 ContentProvider의 쿼리 함수를 사용했습니다. 내 문제는 얼마나 많은 items.I changeCursor 및 notifyDataSetChanged 함수를 사용하지만 아무 쓸모가 쿼리 할 때 목록보기 항목의 수를 늘리려면 커서를 변경하려면 커서를 변경하는 것입니다. – breeze

+0

질문을 편집하고 코드를 추가하여보다 잘 도와 드리겠습니다. –

+0

고마워, 나는 질문에 relatived 코드를 추가했다. – breeze

관련 문제