我有一个Android ListActivity是由数据库支持Cursor通过SimpleCursorAdapter.
单击项目时,将切换数据库中相应行中的标志字段,并且需要更新列表中的视图.
问题是,当更新的视图离开屏幕并被回收时,旧视图返回到视图时会显示在视图上.每当thr list重绘时(方向更改等),都会发生同样的事情.
我notifydatasetchanged()用来刷新光标适配器,但似乎无效.
我应该如何更新数据库以便更新游标?
我在FragmentActivity中使用ListFragment以及SimpleCursorAdapter和修改过的CursorLoader.修改后的CursorLoader只发出rawQueries - 没有其他更改.
在FragmentActivity中的某个时刻,我需要重新获取在ListFragment中提供ListView的数据/光标.
我怎样才能做到这一点?
提前谢谢了.
这是FragmentActivity调用ListFragment中的方法:
public class ActivityList extends FragmentActivity {
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {
...
processUpdateList();
}
...
private void processUpdateList() {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentlist);
if (fragment != null) {
((FragmentList) fragment).requeryList();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里是ListFragment,该方法应该启动对ListView的重新查询,重新加载或重新绘制.ListView.invalidate()没有帮助 - 它没有改变显示的数据.
public class FragmentList extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
private SimpleCursorAdapter adapter;
private Context context;
private ListView listView;
public void requeryList() {
// listView.invalidate(); didn't re-query
// TODO: How???
} …Run Code Online (Sandbox Code Playgroud) android listview simplecursoradapter android-fragments android-fragmentactivity
我的问题:每当我通过其(自定义的)SimpleCursorAdapter更新其内容时,我的ListView会将其滚动位置重置为顶部.我希望ListView在更新时保持其滚动位置.
我开始时每次都使用创建一个新的适配器实例ListView.setAdapter(),但根据这个讨论,我应该更新适配器而不是重置它.我无法找到一种方法来为SimpleCursorAdapter正常工作.
以下是我尝试过的一些事情,省略了方法参数:
- SimpleCursorAdapter.changeCursorAndColumns()使用新光标成功更新适配器但仍然重置滚动位置.
- SimpleCursorAdapter.changeCursor()行为方式相同.
- SimpleCursorAdapter.swapCursor()直到api 11才可用,我正在为api 8开发.
- SimpleCursorAdapter.notifyDataSetChanged()不更新ListView.(也许我还缺少另一个步骤.)
- ListView.invalidate()不更新ListView.
- SimpleCursorAdapter.requery()使ListView为空白,不推荐使用.
- 我对ListView.setSelection()解决方案很熟悉,但我不希望我的ListView在更新时完全移动.这会将其捕捉到列表中的某个位置.
这似乎应该是一个普通而简单的问题.有人处理过吗?
我正在尝试刷新使用创建为SimpleCursorAdapter的ListAdapter的ListView.
这是我在onCreate中创建Cursor和ListAdapter的代码,它填充了ListView.
tCursor = db.getAllEntries();
ListAdapter adapter=new SimpleCursorAdapter(this,
R.layout.row, tCursor,
new String[] columns,
new int[] {R.id.rowid, R.id.date});
setListAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
然后,我在另一个方法中向db添加一些数据,但我无法弄清楚如何刷新ListView.stackoverflow和其他地方的类似问题提到使用notifyDataSetChanged()和requery(),但ListAdapter或SimpleCursorAdapter的方法都没有.
android ×4
listview ×3
cursor ×1
database ×1
listactivity ×1
listadapter ×1
refresh ×1
sqlite ×1