如果您想永久保存数据,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);
}
我还在我的一些应用程序上使用了 web 服务,并且 savedInstanceState 对于在我在片段之间切换视图时不再进行 web 服务调用非常有用。这种情况适用于片段视图被销毁但片段仍然存在的情况。再次创建视图时,它将使用缓存的数据,而不是从 Web 服务再次下载。
要将 Parcelable 从 Activity 发送到片段(根据 biovamp 的示例),您可以使用:
Bundle args = new Bundle();
args.putParcelable("keyName", parcelableObject);
fragment.setArguments(args);
在您的片段中,您使用它来获取您的 Parcelable:
this.getArguments().getParcelable("keyName");
为了创建 Parcelable,请参考本教程,例如:http ://techdroid.kbeanie.com/2010/06/parcelable-how-to-do-that-in-android.html
现在,你说:
然后,当我从列表中单击一个项目时,我想打开一个新活动
因此,如果您仍想从 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");
}