带有自定义适配器的ListView在第一次加载器重新启动时滚动到底部

时间:2018-05-07 14:07:10

标签: android android-arrayadapter android-cursor

我在这里遇到一个奇怪的问题。

在我的应用程序中,用户需要在更新一些首选项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()在其内容发生变化时。

2 个答案:

答案 0 :(得分:0)

我建议

if (cursor.getCount() > 0) {
    cursor.moveToPosition(-1);
    while (cursor.moveToNext()) {
          <do stuff>
    }
}

cursor.close();

答案 1 :(得分:0)

我猜您的listViewCHOICE_MODE_SINGLE,并且listView中选择了最后一项,因此listView会滚动到所选内容。

如果您不需要在listView上选择项目,请使用此选项:

listView.setChoiceMode(ListView.CHOICE_MODE_NONE)

或xml:android:choiceMode="none"

否则,如果您需要选择设置,请在listView

中设置适配器后使用此设置
listView.clearChoices();
listView.setAdapter(listView.getAdapter());

如果您想要选择第一个项目并滚动到顶部,您可以使用以下代码:

listView.setSelectionAfterHeaderView();

listView.setSelection(0);