gpt4 book ai didi

android - 存储状态数据的更好方式/位置( ListView )

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

我是 Android 的新手,我对列表、 fragment 和某些状态数据的存储位置有一些疑问。我在一个示例中工作,其中我有一个 ListView 和一个使用 fragment 的详细 View 。当我第一次打开应用程序时,我(从网络服务)加载了一个项目列表(使用 asyntask)。我想“保存”那个列表,所以如果我需要回到这个 Activity (列表)我不需要再次执行异步任务。“保存”此列表的更好位置在哪里? Application 对象是个好地方吗?

然后,当我单击列表中的项目时,我想打开一个新 Activity 并从该对象加载详细数据。将该对象传递给详细信息 Activity 的最佳方式是什么?使用 Application 对象并从列表中获取所选项目(例如使用来自 onItemSelectedListener 的位置参数)(如果我有一个包含应用程序对象中的项目的列表)?让我的“Item”对象实现 Parcelable 接口(interface)并在 Intent 中传递整个对象?还有其他想法吗?

谢谢,对不起我的英语。

最佳答案

如果您想永久保留数据,SQLite 是正确的选择。

如果你想临时缓存数据,这里有 savedInstanceState Bundle。我将向您展示一个使用 Fragment 和 ListView 的示例。

public static final String BUNDLE_CACHE = "ListFragment.BUNDLE_CACHE";

private ArrayList<ListItem> mCachedData;
private ListView mListView;
private ListItemAdapter mListAdapter;

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

if ((savedInstanceState != null) && savedInstanceState.containsKey(BUNDLE_CACHE)) {
this.mCachedData = savedInstanceState.getParcelableArrayList(BUNDLE_CACHE);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);

LinearLayout layout = (LinearLayout) inflater.inflate(
R.layout.layout_fragment, null);

this.mListAdapter = new ListAdapter(inflater.getContext(),
R.layout.item_list_topic_categories);

this.mListView = (ListView) layout.findViewById(R.id.listView);
this.mListView.setAdapter(this.mListAdapter);
this.mListView.setOnItemClickListener(this.mItemClickListener);

if (this.mCachedData == null) {
Log.d("onCreateView", "I make the request");
this.downloadData();
... // After download is finished, you put somewhere:
this.mCachedData = downloadedData;
} else {
Log.d("onCreateView", "Cool, the data is cached");
this.buildList(this.mCachedData);
}

return layout;
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// You put the content of your list, which is this.mCachedData, in the state
outState.getParcelableArrayList(BUNDLE_CACHE, this.mCachedData);
}

我还在我的一些应用程序上使用了网络服务,当我在 fragment 之间切换 View 时,savedInstanceState 对于不再调用网络服务非常有用。这种情况适用于 fragment View 被销毁但 fragment 仍然存在的情况。再次创建 View 时,它将使用缓存的数据,而不是再次从 web 服务下载。


要将 Parcelable 发送到 Activity 中的 fragment (根据 biovamp 的示例),您可以使用:

Bundle args = new Bundle();
args.putParcelable("keyName", parcelableObject);
fragment.setArguments(args);

在您的 fragment 中,您使用它来获取您的 Parcelable:

this.getArguments().getParcelable("keyName");

要创建 Parcelable,请引用本教程,例如:http://techdroid.kbeanie.com/2010/06/parcelable-how-to-do-that-in-android.html

现在,你说:

Then, when i click an item from the list i want to open a new activity

因此,如果您仍想从 ListFragment 创建 DetailsActivity,您可以使用 Intent 发送数据:

ListItem item = ... // get your item data
intent.putExtra("keyItem", item);

并使用以下方法将其放入新创建的 DetailsActivity 中:

Bundle extras = getIntent().getExtras();
if (extras !=null) {
ListItem value = (ListItem) extras.getParcelable("keyItem");
}

关于android - 存储状态数据的更好方式/位置( ListView ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11956739/

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