在方向更改后在列表视图中恢复项目和滚动位置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在方向更改后在列表视图中恢复项目和滚动位置相关的知识,希望对你有一定的参考价值。

[我尝试通过多种方式在用户旋转手机时恢复列表视图的数据。但是,由于以下事实,我遇到了一些困难,因为当我旋转屏幕一次时,它可以工作,但是当我翻转屏幕时,再一次,它不再起作用。此外,我尝试恢复滚动位置,但没有成功。

所以我想知道最好的方法。


我的代码:

private ListView item_container;
private ArrayList<Song.Hits> values;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    item_container = findViewById(R.id.bottom_popup_container);
}

当我完成从API检索数据时,将它们加载到列表视图中(并保存数据):

@Override
public void onRequestFinish(ArrayList<Song.Hits> hits) {
    if (!hits.isEmpty()) {
        CAdapter adapter = new CAdapter(hits);
        item_container.setAdapter(adapter);
        values = adapter.getHits();
    };
}

最后,我覆盖了这两种方法以保存列表视图的位置和项目。

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putParcelableArrayList("list",  values);
        outState.putParcelable("pos", item_container.onSaveInstanceState());
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
            ArrayList<Song.Hits> values = savedInstanceState.getParcelableArrayList("list");
            if (values != null) {
                CAdapter adapter = new CAdapter(values);
                item_container.setAdapter(adapter);
                item_container.onRestoreInstanceState(savedInstanceState.getParcelable("pos"));
            }
    }
答案

您还应该更新OnCreate方法或重写OnPostCreate方法,并在检查saveInstanceState!= null时添加您在onRestoreInstanceState中使用的逻辑!>

以上是关于在方向更改后在列表视图中恢复项目和滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

方向/配置更改后如何维护 ListView 片段状态?

方向更改时,片段视图为空

UAMP MediaBrowser 方向

在方向更改时保留列表片段中的列表

滚动位置在列表视图的顶部

Imageview 在滚动列表视图上自动更改