gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:14:11 24 4
gpt4 key购买 nike

我想使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com