【问题标题】:Multiple ArrayAdapter, single array多个 ArrayAdapter,单个数组
【发布时间】:2012-03-02 12:50:20
【问题描述】:

我有一个 ArrayList,其中包含用于显示的数据。内容异步更改。 我想在两个活动中显示数据,两者都使用 ArrayAdapter(不是同一个类)。

问题在于 ArrayAdapter 通过添加、插入和删除提供同步访问和通知。所以同步访问只能通过一个而不是两个适配器实现。

ArrayAdapter 本身不可重用,因为使用了不同的视图。

所以问题是:一个 ArrayList 和多个 ArrayAdapter 的推荐架构是什么?

更新
我想澄清一下。目前我只有一个 ArrayAdapter。

  • 数据存储在 ArrayList 中
  • 服务正在通过 ArrayAdapter 在后台更新数据
  • Activity 和服务都通过 ArrayAdapter 访问 ArrayList(多线程同步问题),但这不是问题,因为 ArrayAdapter 会进行锁定

现在我有另一个活动,它也应该显示相同的 ArrayList,但我不知道该怎么做。显然我需要另一个 ArrayAdapter,因为第二个活动有另一个布局。这意味着两个活动和一个服务正在访问同一个 ArrayList。 ArrayAdapter 的同步已经不够用了,因为锁在 ArrayAdapter 里面,也就是说如果 service 和 activity 1 都在使用 ArrayAdapter 1,ArrayAdapter 2 仍然会访问和修改 ArrayList。

【问题讨论】:

    标签: android synchronization arraylist adapter android-arrayadapter


    【解决方案1】:

    内容是异步变化的。

    我不确定我是否了解您如何在两个活动之间使用 ArrayList。 (静态字段?)

    问题是 ArrayAdapter 获得了数组的所有权(它 复制它)。

    我不相信它会复制它。它存储对它的引用。 (如果我错了,请纠正我)

    当 Activity2 被激活并创建 ArrayAdapter2 时,ArrayList 仍然属于 ArrayAdapter1。

    此时,两个 ArrayAdapter 都应该引用同一个 ArrayList。这意味着 ArrayList 中的更改将反映在两个适配器中。

    【讨论】:

    • 你能提供一个安卓代码(数组适配器)的证明链接吗,我可能错了,但你的答案可能不正确
    • 1) ArrayList 是某处的静态字段。 2)你是对的。 3) 是的,但同步访问和通知只能通过一个适配器实现
    【解决方案2】:

    对两个活动使用一个全局数组适配器并观察您的异步数据。

    【讨论】:

    • 但数组适配器是特定于视图的。你能说得更具体点还是给我举个例子?
    • 如果你查看 github 代码 github.com/android/platform_frameworks_base/blob/master/core/… 你可以看到只有方法 add()、insert() 等调用 notifyDataSetChanged() 并填充 mObjects。所以当你的 ArrayList 中有一些异步更改时,第二个(另一个)ArrayAdapter 不知道它
    【解决方案3】:

    这不是问题。通过一个适配器更改arrayList 后,为另一个适配器调用notifyDataSetChanged()。这就是你所需要的,恕我直言。至少,这对于我的 ArrayList 来说已经足够了,它也与它的适配器在不同的 Activity 中。我“手动”更改它并稍后通知适配器。

    如果您想要一个带有两个适配器的 ListView,那么严重的问题将是。但我认为这是一项意义不大的任务。

    将答案更新到更新后的问题:

    因此,问题不在于由不同 ArrayAdapter 使用相同数组列表的两个活动,而在于可能使用两个不同数组适配器的三个组件。但是,如果您只使用第二个适配器来显示相同​​的列表,正如您在此处所写的那样,您根本不需要任何额外的同步。每次重大更改后只需调用 adapter2.notifyDataSetChanged() 即可。

    只有当您通过两个不同的适配器同时进行更改时,才会出现问题。每个人都不会及时收到另一个人所做的更改的通知。至于可能同时写入的情况下的活动之间的同步,您可以通过在每次将焦点从一个活动更改为另一个活动后通知来实现它。

    但是,只有当您发现自己的代码中有一些重要的点应该进行相互通知和锁定/解锁时,才能在 service+adapter1 和 activity+adapter2 之间实现同步。

    【讨论】:

    • 但是当你这样做时,锁定不起作用。两个 ArrayAdapter 使用不同的锁,这意味着对 ArrayList 的访问是不同步的。这就是困扰我的地方。
    • 啊!您想保证,当您使用适配器 1 时,适配器 2 不会刷新?
    • 恕我直言,适配器仅在 ListView 刷新自身时(即重绘时)才会刷新。或者通过 notifyDataSetChanged。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2016-05-26
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多