Android:无限滚动 - ListView 和 Cursor
我有大约 15,000 行的数据库表,我想将其显示在列表视图中。我想显示前 100 个,当用户向下滚动到最后一个项目时,应该加载下一个 100 个(依此类推...)。我已经实现了 OnScrollListener() ,它调用 AsyncTask 负责加载更多项目。我遇到的问题是,在将更多行添加到游标后,我的 SimpleCursorAdapter 没有更新。我尝试过adapter.notifyDataSetChanged();但这没有任何作用。
这是列表侦听器:
myListView.setOnScrollListener(new OnScrollListener(){
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if(resultCursor != null){
if(lastInScreen == totalItemCount && isLoadingMore == false){
isLoadingMore = true;
loadedPage ++;
new LoadBooks().execute();
}
}
}
public void onScrollStateChanged(AbsListView view, int scrollState) {}
});
这是我的 AsyncTask 类:
private class LoadBooks extends AsyncTask<String, Void, Void> {
private final ProgressDialog dialog = new ProgressDialog(FullIndex.this);
@Override
protected void onPreExecute() {
this.dialog.setMessage("Loading books...");
this.dialog.show();
}
@Override
protected Void doInBackground(String... arg0) {
try{
resultCursor = dbHelper.fetchBooks(0, loadedPage * LIMIT_RESULTS);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(final Void unused){
if(resultCursor != null){
if(adapter == null){
startManagingCursor(resultCursor);
String[] from = new String[]{"name"};
int[] to = new int[]{R.id.book_item_tbx};
getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
adapter = new SimpleCursorAdapter(FullIndex.this, R.layout.book_item, resultCursor, from, to);
setListAdapter(adp);
}else{
adapter.notifyDataSetChanged();
}
}
if(dialog != null && dialog.isShowing()){
dialog.dismiss();
}
isLoadingMore = false;
}
}
新行已添加到 resultCursor 但列表未更新,我缺少什么?
I have DB table with ~15,000 rows which I want to display in the listview. I want to display first 100 and when the user scrolls down to the last item the next 100 should be loaded (an so on...). I have implemented on OnScrollListener() which calls AsyncTask responsible for loading more items. The problem I've got is that my SimpleCursorAdapter is not updated after more rows are added to the cursor. I have tried adapter.notifyDataSetChanged(); but that doesn't do anything.
This is the list listener:
myListView.setOnScrollListener(new OnScrollListener(){
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
if(resultCursor != null){
if(lastInScreen == totalItemCount && isLoadingMore == false){
isLoadingMore = true;
loadedPage ++;
new LoadBooks().execute();
}
}
}
public void onScrollStateChanged(AbsListView view, int scrollState) {}
});
This is my AsyncTask class:
private class LoadBooks extends AsyncTask<String, Void, Void> {
private final ProgressDialog dialog = new ProgressDialog(FullIndex.this);
@Override
protected void onPreExecute() {
this.dialog.setMessage("Loading books...");
this.dialog.show();
}
@Override
protected Void doInBackground(String... arg0) {
try{
resultCursor = dbHelper.fetchBooks(0, loadedPage * LIMIT_RESULTS);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(final Void unused){
if(resultCursor != null){
if(adapter == null){
startManagingCursor(resultCursor);
String[] from = new String[]{"name"};
int[] to = new int[]{R.id.book_item_tbx};
getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
adapter = new SimpleCursorAdapter(FullIndex.this, R.layout.book_item, resultCursor, from, to);
setListAdapter(adp);
}else{
adapter.notifyDataSetChanged();
}
}
if(dialog != null && dialog.isShowing()){
dialog.dismiss();
}
isLoadingMore = false;
}
}
New rows are added to resultCursor but the list is not updated, what am I missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我将发布一个代码,我用它在滚动事件中每个记录填充 10 条记录。
fetchHistory(int count)
是我用来设置totalHistoryItemCount
& 的值的方法。checkInCheckOutHistoryList
。希望这会有所帮助。
I will post a code which I have used to populated 10 records each on scroll event.
fetchHistory(int count)
is the method I have used to set the values fortotalHistoryItemCount
&checkInCheckOutHistoryList
.Hope this would help.