android - 如何通过SimpleCursorAdapter更新从数据库中查询到数据的listview?

标签 android cursor simplecursoradapter

我想使用 SimpleCursorAdapter 在 ListView 中显示从数据库查询的项目。 例如,数据库中可能有 20,000 个项目。我只想加载查询的100个项目(_id:1-100)而不是加载所有项目,在 ListView 末尾滚动时,加载另外100个项目(_id:101-200)查询,如何实现?欢迎任何建议,谢谢。

相关代码如下:

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);
}

在我定义的 ListView 中,我想通过查询数据库加载更多项目。

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);
    } 

最佳答案

使用 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() , 通过 null作为cursornew 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>*/);

关于android - 如何通过SimpleCursorAdapter更新从数据库中查询到数据的listview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8868819/

相关文章:

mysql - mysql存储过程中游标内的选择语句未考虑关键字

android - 多个插入语句android sqlite

java - Android BLE onCharacteristicChanged 未触发

html - CSS 自定义光标在 Chrome 中不起作用

java - 无法从 CursorWindow 读取第 0 行,第 9 列

java - 通过 onClick ImageView 使用 SimpleCursorAdapter 更新/编辑 Sqlite 数据库

Android 的 SimpleCursorAdapter 使用 DISTINCT 进行查询

Android ListView 更新

android - NinePatch Images 的主要来源?

php - 如何在 Titanium (Android) 中以 jpg 或 png 格式在服务器上上传图像?