【问题标题】:Accessing adapter and other data in an activity from main activity从主活动访问活动中的适配器和其他数据
【发布时间】:2016-02-12 23:52:46
【问题描述】:

我想知道在活动之间访问非原始数据的正确方法是什么。虽然关于这个话题有很多问题和答案,但我仍然认为我的问题还没有被问到。

1) 主要活动显示自定义适配器ToDoListAdapterToDoManagerActivityonPause()onResume() 的方法 loadItems()saveItems() 中加载条目数据:

public class ToDoManagerActivity extends ListActivity {
    toDoListAdapter mAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mAdapter = new ToDoListAdapter(ToDoManagerActivity.this);
        .....
    }
}

2) 另一个活动TodoChartActivity 是从ToDoListAdapter 视图中触发的,它是一个显示所有条目的活动,但方式不同。为了显示条目,我需要主要活动中适配器变量中的数据。

根据互联网上的消息来源,there are 在第二个活动中使适配器变量(或任何其他)可访问的不同方法:

  1. mAdapter 设为 public 和 static 或将其设为 public getter&setter。 糟糕的方法
  2. 从应用程序单例访问它。 BAD APPROACH
  3. ToDoManagerActivity 复制loadItems()saveItems() 并将它们再次加载到内存中。因为我使用的内存比我实际需要的多得多——糟糕的方法
  4. 通过 Intent Extras 传递一个列表条目的所有数据。 繁琐的方法,有人告诉我。另外,让我们想象一下,例如,我们需要所有条目。所以,这是一个普遍的问题。

您还有其他建议,如何在活动之间访问复杂的对象和列表?

【问题讨论】:

  • EditTodoActivity 的名称表明您正在处理单个待办事项,所以为什么不直接传递它的 id 并让 EditTodoActivity 加载相关详细信息。或者换句话说,你为什么要通过适配器?
  • @soshial,您始终可以通过 Intent 将数据从 ToDoManagerActivity 传递到 EditToDoActivity。如果要传递自定义对象,请确保它们实现 Parcelable 接口。
  • 我知道,可以通过 Intent Extras 传递一个 ToDoItem 的数据,但我想总的来说。想象一下,每个列表条目都太大而无法像那样传递它。此外,每次都添加和提取额外内容有点乏味。
  • @soshial 这就是为什么你像 Cory 所说的那样传递一个 ID,然后提取相关数据。如果您只想加载一次数据,那么您就会陷入原始问题中提到的不良方法
  • @chaitanya,如果我只将一个 id 传递给第二个活动,那么我从哪里获取所有数据。为此,我需要将第二个活动中的所有数据再次加载到内存中,这在内存方面不是一件好事。这就是为什么访问 mAdapter 变量似乎是更好的选择,综上所述,你怎么看?

标签: java android android-activity android-adapter


【解决方案1】:

ToDoManagerActivity 是您的第一个 Activity,您从这里启动 ToDoListAdapter 并从 ToDoListAdapter 膨胀 TodoChartActivity .

这是一种常见的情况。由于您的数据是相同的,因此只需在适配器之间共享即可。

ToDoManagerActivity 传递您的 ToDoListAdapter 中的对象列表。现在,您的数据在此适配器中。现在,将相同的数据传递给 TodoChartActivity

【讨论】:

  • 我的确切问题是:如何。另外,我不会在我的适配器中膨胀 TodoChartActivity。另外,我只有一个适配器,而你说有几个。
【解决方案2】:

除非其内容的生命周期比这两个活动使用的时间长,否则单例不一定是一种糟糕的方法。您甚至可以将容器对象放在 WeakReference 中,以便在使用数据的两个活动不再存在并持有对数据的引用后对其进行垃圾收集。这种方法的主要缺点是,如果需要销毁和重新创建活动,您的活动无法保存和保留它们的状态。

您还可以将数据保存到 sqlite 数据库。如果您不想将所有对象中的所有字段分解为 sqlite 字段,您可以“作弊”并将它们序列化为 JSON,使用类似 Gson 的东西,如果您的模型数据可以表示为,这将自动执行此过程Java 原始类型和基本集合。如果你这样做,那么你的活动也可以从保存在 sqlite 中的数据中重建自己,以防它们被 Android 破坏。不利的一面是,您现在必须确定何时从数据库中删除不再使用的数据。如果您需要在应用中一次多次使用此方案,您需要能够使用某个 id 来识别每个数据集合,并确保 id 在活动之间共享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多