Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 带有自定义适配器的ListView在第一次加载程序重新启动时滚动到底_Android_Android Arrayadapter_Android Cursor - Fatal编程技术网

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