草庐IT

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

coder 2023-12-23 原文

我是 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/

有关android - 存储状态数据的更好方式/位置( ListView )的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby-on-rails - 正确的 Rails 2.1 做事方式 - 2

    question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参

  7. ruby-on-rails - 更好的替代方法 try( :output). try( :data). try( :name)? - 2

    “输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

  8. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  9. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  10. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

随机推荐