2012-07-25 58 views
14

我有一個ListFragment,由ArrayAdapter支持,並由Loader填充。當用戶點擊其中一個項目時,我想將對所選項目的引用以及其他列表項目傳遞給另一個片段。我的問題是如何從適配器中獲取所有項目?下面是我看到的可能性:獲取ArrayAdapter中的所有項目

1.保持一個參考後盾List

創建適配器像這樣:

List<DomainObject> items = new ArrayList<DomainObject>(); 
listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine, items); 

,然後簡單地傳遞items或它的一個副本到下一個活動。

我看到的缺點是,我依賴的是無證的事實,即我傳遞給構造函數的同一列表包含後面的項目。

2.迭代通過適配器

當單擊某個項目,遍歷適配器,建立名單。這似乎是不必要的工作量。這些項目包含在適配器中的List中,我將每個項目手動複製到新列表中。

3.保持項目的單獨列表添加到適配器

將項目添加到適配器前時,將它添加到一個單獨的列表,我的片段維護。這也是浪費,因爲項目列表被複制到ArrayAdapter和片段中。

回答

7

的解決方案,我在此期間曠古只是不使用ArrayAdapter。如果您正在與此API作鬥爭,似乎最好使用不太全面(且複雜)的BaseAdapter。您可以閱讀更多關於BaseAdapter而不是ArrayAdapter在本文中的決定:Android Adapter Good Practices

+0

雖然這篇文章大多是好的,但我會忽略他的整個線程安全部分。他完全錯誤地假設爲什麼會有鎖(由於在後臺線程中發生過濾),並且如果在除UI線程之外的任何其他任何情況下調用notifyDataSetChanged(),則ArrayAdapter已經崩潰。 – 2014-12-09 01:04:34

+0

@ scompt.com我認爲你發佈的鏈接是錯誤的解釋ArrayAdapter。這似乎只解釋了ArrayAdapter 。我有點困惑... – theMfromA 2015-06-12 08:49:38

+0

從您鏈接的頁面...「只能顯示文字。」 =>錯了。 「強制您提供CharSequence項目列表...」=>錯誤「要求您提供僅包含TextView」的佈局資源=>錯誤。幾乎所有的假設都是錯誤的...我不是說ArrayAdapter比BaseAdapter更好,但基本知識是錯誤的。 – Loenix 2016-08-12 09:20:08

-2

我覺得第一種方法是做到這一點的最佳方法。

我不認爲,數據將是另一個活動的原始數據。因爲,你會通過捆綁傳遞物品,所以對象首先被寫在捆綁上,然後在我們從捆綁中讀取的下一個活動中。

但是,如果您使用某種其他方式來通過列表,請使用list.clone()創建新對象,而不是傳遞原始對象。

27

我有點遲到了,但是我遇到了類似的問題。

處理#1的一種方法是在ArrayAdapter的子類中維護對列表的引用,以便重用由適配器對象控制。

喜歡的東西:

public class DomainAdapter extends ArrayAdapter<DomainObject> { 

    private final List<DomainObject> items; 

    public DomainAdapter(Context context, List<DomainObject> items) { 
     super(context, R.layout.mine, items); 
     this.items = items; 
    } 

    public List<DomainObject> getItems() { 
     return items; 
    } 
} 
+9

注意。如果您打算在某個時候過濾適配器,則此方法有可能失敗。在ArrayAdapter內部執行過濾器將創建List的全新實例。這意味着你的外部定義的「項目」將不再是相同的列表。這意味着如果稍後進行了修改,它將會失去同步。你可以在這裏閱讀更多關於它:http://www.jaysoyer.com/2014/07/constructor-woes-androids-arrayadapter/ – 2014-12-09 00:59:48

0

快速測試表明方法1有效。它看起來是最快最乾淨的,但由於它沒有記錄,所以您可能希望在預期的平臺上進行測試,以及在ArrayAdapter的基礎結構發生變化時進行更新。

我使用SDK編譯版本22和分鐘SDK版10.

0

最好的方法是「保持的列表的參考」,而不是通過「項目」變量/參數的構造:

List<DomainObject> items = new ArrayList<DomainObject>(); listAdapter = new ArrayAdapter<DomainObject>(getActivity(), R.layout.mine);

這樣你只能將ArrayList實例化爲一個空數組,你將不得不自己管理你的列表。