0

我有一個包含數據顯示的ArrayList。內容異步變化。 我想在兩個活動中顯示數據,兩個都使用ArrayAdapter(不是同一個類)。多個ArrayAdapter,單個數組

問題是ArrayAdapter通過添加,插入和刪除來提供同步訪問和通知。所以同步訪問只能通過一個而不是兩個adapers。

由於使用了不同的視圖,ArrayAdapter本身不可重用。

所以問題是:什麼是推薦的架構有一個ArrayList與多個ArrayAdapter的?

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

  • 的數據被存儲在一個ArrayList
  • 一個服務是在後臺經由一個ArrayAdapter
  • 活性和服務通過一個ArrayAdapter訪問該ArrayList(多線程同步問題)更新數據,但是這是沒有問題的,因爲ArrayAdapter的鎖定

現在我有另一個活動,應該也顯示相同的ArrayList,我不知道該怎麼做。顯然我需要另一個ArrayAdapter,因爲第二個活動有另一個佈局。這意味着兩個活動和一個服務正在訪問相同的ArrayList。 ArrayAdapter的同步是不夠的,因爲鎖定在ArrayAdapter中,這意味着如果服務和活動1使用ArrayAdapter 1,則ArrayAdapter 2仍將訪問和修改ArrayList。

回答

3

內容異步變化。

我不知道我明白你如何在兩個活動之間使用ArrayList。 (靜態字段?)

問題是ArrayAdapter獲取數組的所有權(它 複製它)。

我不相信它重複它。它存儲對它的引用。 (糾正我,如果我錯了)

當Activity2被激活並創建ArrayAdapter2時,ArrayList 仍屬於ArrayAdapter1。

這兩個ArrayAdapter都應該有一個對同一個ArrayList的引用。這意味着ArrayList中的更改將反映在兩個適配器中。

+0

你能給一個android代碼(數組適配器)的證明鏈接,我可能是錯的,但你的答案可能不正確 – Yahor10 2012-03-02 13:12:19

+0

第312行 - https://github.com/android/platform_frameworks_base/blob/master/core/java /android/widget/ArrayAdapter.java#L308 – 2012-03-02 13:59:27

+0

1)ArrayList是一個靜態字段。 2)你是對的。 3)是,但同步訪問和通知只能通過一個適配器 – ChrLipp 2012-03-02 14:58:04

0

使用一個全局數組適配器進行兩個活動並觀察您的異步數據。

+0

但是,陣列適配器是特定於視圖的。你能更具體還是指點我一個例子? – ChrLipp 2012-03-02 14:58:39

+0

如果你看看github上的代碼https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/ArrayAdapter.java你可以看到,只有方法添加(),插入()和等電話notifyDataSetChanged()並填充mObjects.So當ArrayList中有一些異步更改時,第二個(另一個)ArrayAdapter會知道它 – Yahor10 2012-03-02 16:15:17

+0

已更新的問題描述。 – ChrLipp 2012-03-05 14:44:39

0

這不是問題。通過一個適配器更改arrayList之後,請爲另一個適配器調用notifyDataSetChanged()。這就是你需要的,恕我直言。至少,對於我的ArrayList來說,它也適用於不同的Activity和它的適配器。我「手動」更改它,並在稍後通知適配器。

嚴重的問題將是,如果你想有一個ListView與兩個適配器。但是,我認爲這是一個有意義的任務。

更新回答到更新的問題:

所以,問題不在於使用相同的ArrayList不同ArrayAdapters兩個活動,但在三個組成部分可能使用兩個不同的arrayadapters。但是,如果您僅使用第二個適配器來顯示相同​​的列表,如您在此處編寫的那樣,則根本不需要任何額外的同步。每次重大更改後,都可以調用adapter2.notifyDataSetChanged()。

只有當你通過兩個不同的適配器做同步變化可能出現的問題。每個人都不會及時通知另一個人所做的更改。至於在可能的同時寫作的情況下活動之間的同步,您可以通過在每個活動之間的每個更改焦點之後通知它來達到它。

但服務+適配器1和活動+適配器2間編寫的同步可以只達到了,如果你會發現youself代碼中的一些要點,其中相互通知和鎖定/解鎖應。

+0

但是,當你這樣做時,鎖定不起作用。這兩個ArrayAdapter都使用不同的鎖,這意味着對ArrayList的訪問不會同步。這就是困擾我的東西。 – ChrLipp 2012-03-04 09:32:25

+0

啊!您要保證,在使用適配器1時適配器2不會刷新? – Gangnus 2012-03-04 18:04:13

+0

恕我直言,適配器僅在ListView刷新自身時(即在重繪時)刷新自身。或通過notifyDataSetChanged。 – Gangnus 2012-03-04 19:08:37