2013-08-20 73 views
0

所以我有一個自定義列表適配器,我創建了我試圖使動態。它開始爲空,然後用戶可以動態添加或刪除項目。除了一件事情之外,一切正常:適配器的'getView'不會被調用,因爲我的更新了適配器,因此該項目的標題 - 顯然 - 沒有設置(而是顯示它的地址)。 下面是更新數組的代碼:自定義ArrayAdapter'getView'方法不會被更新時調用

private void newTab(String name, String url){ 
    _tabAdapter.add(new Article(name,url)); 
    _tabAdapter.notifyDataSetChanged();  
    _tabCount++; 
} 

下面是適配器本身的代碼:

public class TabAdapter extends ArrayAdapter<Article>{ 
     Context _context; 
     @Override 
     public int getCount() { 
      return _tabCount; 
     } 

     public TabAdapter(Context c) { 
      super(c, R.layout.tab_item); 
      _context=c; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater=(LayoutInflater) _context. 
        getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View _view = inflater.inflate(R.layout.tab_item, parent,false); 
      TextView _itemText = (TextView) _view.findViewById(R.id.tab_text); 
      Article getArticle = getItem(position); 
      String newName = getArticle.getName(); 
      _itemText.setText(newName); 
      return _view; 
     } 
    } 

現在一切工作正常 - 甚至的OnClick的偉大工程,正確地得到紡織機械展覽會的名字,它是隻是不顯示項目名稱的列表本身。我必須錯過一些非常基本的東西,但我找不到它是什麼。任何幫助,將不勝感激。

更新:雖然它不是提到確切的解決問題的辦法,我設法通過了「文章」類創建一個「的toString()」方法來解決它 - 所以現在的標題顯示爲它應該 - 除了它不是一個非常優雅的解決方案。

+0

您的「更新」代碼是將一個項目添加到列表的末尾。您沒有向我們展示您如何更改現有項目的標題。或者你是否說你添加的新項目顯示不正確? – goto10

+0

後者。新項目顯示的是內存地址而不是標題。 –

回答

0

您需要一個構造函數來傳遞文章列表。

TabAdapter (Context context, int resource, T[] objects) 

無論何時您的列表被修改,您需要重新初始化適配器以獲取更新的視圖。

+0

所以我需要在每次更新時都創建適配器的新實例? –

+0

不,這是不正確的。這是notifyDataSetChanged的全部要點。您被允許更改現有適配器的後備數據。 – goto10

+0

我試過了,但它似乎沒有什麼區別。 –

0

根據你的問題,這個問題可能是因爲getView()方法確實在你調用它時調用,但它仍然有舊數據,有可能你有多餘的ListFragment副本,更新的適配器數據不可見

更新數據後,您可以通過ListView.invalidateViews()避免這種情況,這可能會強制您的列表顯示新數據(應調用您的getView()方法)。

其非常重要的,你傳遞值在構造函數中的不同點

調試,如果不檢查落實。

+0

它不被調用的一切,我已經使用斷點嘗試,甚至日誌寫入,但沒有越來越調用。 「invalidateViews()」也沒有做到這一點。 –

0

ArrayAdapter根據內部後備集合中的項目數跟蹤它自己的計數。此外,除非您已通過致電setNotifyOnChange(false)明確禁用此功能,否則每次致電添加時都會在內部呼叫notifyDataSetChanged

作爲調試它的第一步,您應該刪除getCount覆蓋以及致電notifyDataSetChanged。我沒有看到導致問題的明顯方式,但最好先簡化代碼。

您是否偶然使用此適配器與Spinner或類似的小部件?如果是這樣,您還必須覆蓋getDropDownView,否則您將獲得默認行爲,即嘗試將集合中的對象呈現爲字符串。

+0

不,這是一個普通的列表視圖。 –

相關問題