Android 带有自定义适配器的ListView在第一次加载程序重新启动时滚动到底
我在这里面临一个奇怪的问题 在我的应用程序中,用户需要在更新一些首选项后重新启动加载程序Android 带有自定义适配器的ListView在第一次加载程序重新启动时滚动到底,android,android-arrayadapter,android-cursor,Android,Android Arrayadapter,Android Cursor,我在这里面临一个奇怪的问题 在我的应用程序中,用户需要在更新一些首选项后重新启动加载程序onLoadFinished,这里一切正常,问题是我设置了mAdapter.notifyDataSetChanged()它会一直滚动到列表的底部 奇怪的是,它只发生一次,第一次重新启动加载程序时。所有其他时间,视图都保持在原来的位置 我正在通知UI线程上的更改 getLoaderManager().initLoader(EXISTING_EVAL_LOADER, null, ViewActivity.this
onLoadFinished
,这里一切正常,问题是我设置了mAdapter.notifyDataSetChanged()代码>它会一直滚动到列表的底部
奇怪的是,它只发生一次,第一次重新启动加载程序时。所有其他时间,视图都保持在原来的位置
我正在通知UI线程上的更改
getLoaderManager().initLoader(EXISTING_EVAL_LOADER, null, ViewActivity.this);
runOnUiThread(new Runnable() {
public void run() {
mAdapter.notifyDataSetChanged();
}
});
如果我不调用notifyDataSetChanged()代码>应用程序崩溃仅在列表项上单击,我得到:
java.lang.IllegalStateException:适配器的内容已更改
已更改,但ListView未收到通知。确保
适配器的内容不是从后台线程修改的,而是
仅从UI线程。确保适配器调用
当其内容更改时,notifyDataSetChanged()
我建议
if (cursor.getCount() > 0) {
cursor.moveToPosition(-1);
while (cursor.moveToNext()) {
<do stuff>
}
}
cursor.close();
if(cursor.getCount()>0){
游标。移动位置(-1);
while(cursor.moveToNext()){
}
}
cursor.close();
我猜您的listView
是CHOICE\u MODE\u SINGLE
,最后一项是在listView
中选择的,因此listView
会滚动到所选内容
如果不需要在列表视图中选择项目,请使用以下选项:
listView.setChoiceMode(ListView.CHOICE_MODE_NONE)
或者使用xml:android:choiceMode=“none”
否则,如果需要选择设置,请在列表视图中设置适配器后使用此选项:
listView.clearChoices();
listView.setAdapter(listView.getAdapter());
如果要选择第一个项目并滚动到顶部,可以使用以下代码:
listView.setSelectionAfterHeaderView();
或
最好使用异步task@D.即便如此,我也不认为这会解决我当前的问题。你在哪里添加你的物品,发布更多的代码。这个prb有很多答案,你检查过了吗?@D.现在无法发布。我正在onLoadFinished,inside cursor中添加我的项目。准确地说,moveToFirst是因为此活动只加载一行。项目的顺序是否为desc
?最近添加的是最后一个项目吗?我将在我的笔记本电脑前试用,然后与您联系。今晚将与您联系。日程安排很忙,我没有机会测试太多。@Eminem经验丰富的用户,如本例中的OP,在接受答案方面不需要帮助。他们会在没有任何人告诉他们的情况下将正确答案标记为已接受。我确实需要我的选择设置和清除选择+重新设置适配器没有任何改变。@Alin使用listView.setSelectionAfterHeaderView()
或listView.setSelection(0)
你测试过吗?@Alin这一项可能有帮助如果(listView.getChildAt(0)!=null)listView.getChildAt(0).requestFocus()
listView.setSelection(0);