gpt4 book ai didi

android - 使用自定义列表适配器保存和恢复 ListView

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:51 25 4
gpt4 key购买 nike

我目前正在使用自定义列表适配器并在运行时修改 ListView 的行(更改文本、按钮等)。

当我启动另一个 fragment 然后返回到包含 ListView 的 fragment 时,我想找到一种方法来保存/恢复在运行时对 listview 所做的更改。

目前每次都会重新加载 ListView ,所有运行时更改都将丢失。

下面显示了我如何设置列表适配器。

 public void setAdapterToListView(ArrayList<item> list) {
ItemList = list;
ItemAdapter adapter = new MenuItemAdapter(list, getActivity(), this);
ItemListView.setAdapter(adapter);
}

然后我使用自定义列表适配器在运行时进行更改(如上所述)。这是我如何在运行时更改内容的 fragment :

if (holder.qty.getText().toString().equals("Qty")) {
relativeLayout.setBackgroundColor(row.getResources().getColor(R.color.navDrawerL ightBlue));
holder.qty.setText("1");
holder.qty.startAnimation(anim);
holder.removeItem.setBackgroundResource(R.drawable.remove_item_red);
holder.removeItem.setEnabled(true);

...

是否有解决此问题的推荐方法?

最佳答案

适配器

您会希望您的自定义适配器为其内部数据实现某种 setter/getter 。例如

public ArrayList<YourDataType> getList() {
return new ArrayList<YourDataType>(mAdapterData);
}

Activity

然后在您的 Activity/fragment 中,您需要保存和恢复该数据。

private static final String STATE_LIST = "State Adapter Data"

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelableArrayList(STATE_LIST, getAdapter().getList());
}

虽然有一个您可以覆盖的 onRestoreInstanceState() 方法,但我通常在 onCreate() 期间恢复。通常在实例化其他事物时更方便。要么是可行的。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//If restoring from state, load the list from the bundle
if (savedInstanceState != null) {
ArrayList<YourDataType> list = savedInstanceState.getParcelableArrayList(STATE_LIST);
ItemAdapter adapter = new MenuItemAdapter(list, getActivity(), this);
} else {
//Else we are creating our Activity from scratch, pull list from where ever you initially get it from
ArrayList<YourDataType> list = getInitData();
ItemAdapter adapter = new MenuItemAdapter(list, getActivity(), this);
}
}

您的数据类型

您没有提到 YourDataType 是什么,但我假设它是一个自定义类。为了使用 bundle 的 savedstate,它必须实现 Parcelable。 Android 的开发 link关于 Parcelable 和 StackOverFlow post解释如何使用 Parcelable 编写您自己的自定义类。

更新

根据您对 fragment 所做的操作,将决定是否调用 onSavedInstanceState() 方法。从您提出问题的方式来看,我假设您将一个 fragment 推到后台以在顶部加载另一个 fragment 。然后点击后退按钮将从后台堆栈重新加载该 fragment ...并传递 bundle 状态以从中重新加载。

当然,这只是众多场景中的一种。有问题的 fragment 完全有可能只执行 onPause() 然后执行 onStop()...然后在重新显示 fragment 时,只看到它执行 onStart () 后跟 onResume()。在这种情况下,不会有保存状态,因为 fragment 从未完全销毁,所以没有什么可以恢复的。它应该处于相同的状态。如果不是,而是您看到它重新加载初始数据...那么您可能正在 onStart() 中或之后重新加载初始数据。您需要将所有初始化数据移至 onCreate()

另一种可能的情况是,您完全销毁了 fragment ,而没有将其放入后台堆栈。重新初始化它不会有可从中提取的已保存状态。如果您想将此 fragment “恢复”到事先的状态,则不能依赖 onSavedInstanceState()。您将需要手动将该信息保存在内存中的某个位置、磁盘或您自己的数据库中。然后相应地从中拉出。

不幸的是, fragment 的生命周期非常复杂,并且在很大程度上取决于使用情况,甚至在支持库与 native fragment 之间也是如此。

关于android - 使用自定义列表适配器保存和恢复 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29201557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com