2012-02-13 92 views
8

首先我的代碼短概述,我希望它可以理解的:與notifyDataSetChanged更新ExpandableListView()

  • 我有一個名爲ToDoElement有幾個變量的類。
  • 我有另一個類叫做ToDoListe,它管理ArrayList中的ToDoElement
  • ToDoListe包含方法deleteElement()從ArrayList中刪除ToDoElement
  • 在我的主要活動liste_activity我創建的ToDoListe一個對象,並與ToDoElement一些對象填充它。
  • 在同樣的活動中,我有一個ExpandableListView,帶有我自己的適配器expListAdapter
  • Adapter通過獲取ToDoElement的字符串變量來創建Groupviews和Childviews。
  • 我爲列表中的每個組項目創建了一個ContextMenu,其中我使用方法deleteElement()

好了,現在這裏是我的問題

後,我使用的方法deleteElement()我想更新我的列表,因爲ArrayList中的ToDoListe的數據變化。所以我打電話expListAdapter.notifyDataSetChanged()
但是,然後我的整個活動崩潰,原因:「IndexOutOfBoundException:索引4無效,大小爲4」(我有5 ToDoELement項目在我的列表中,之前刪除其中之一)。
我知道這是因爲我的一個for循環,但我不知道爲什麼。

代碼片段:

創造ToDoListe的新對象:

private static ToDoListe Liste = new ToDoListe(); 

類ToDoListe(只是重要的方法):

public class ToDoListe { 

    private ArrayList<ToDoElement> ToDoListe; 

    public ToDoListe() 
    { 
     ToDoListe = new ArrayList<ToDoElement>(); 
    } 

    public void newElement(ToDoElement element){ 
     ToDoListe.add(element); 
    } 

    public void deleteElement(int nummer) { 
     ToDoListe.remove(nummer); 
    } 

    public int AnzahlElemente() { 
     return ToDoListe.size(); 
    } 
} 

定義列表適配器:

expListAdapter = new MyListAdapter(this, createGroupList(), createChildList()); 
setListAdapter(expListAdapter); 

創建的ArrayList的名單適配器:

// creates the list with the group items 
private List createGroupList() { 
     ArrayList result = new ArrayList(); 
     for (int i=0; i < Liste.AnzahlElemente(); i++) { 
     result.add(Liste.getElement(i).getUeberschrift()); 
     } 
     return result; 
    } 

// creates the list with the child items 
private List createChildList() { 
     ArrayList result = new ArrayList(); 
     for(int i=0; i < Liste.AnzahlElemente(); i++) { 
      ArrayList secList = new ArrayList(); 
      for(int n = 1 ; n <= 3 ; n++) { 
       if (Liste.getElement(i).getStichpunkt(n).length() != 0){ 
        secList.add("- " + Liste.getElement(i).getStichpunkt(n)); 
       } 
      } 
      result.add(secList); 
     } 
     return result; 
} 

我自己的列表適配器(只是重要的方法):

public class MyListAdapter extends BaseExpandableListAdapter{ 

private ArrayList<String> ueberschriften; 
private ArrayList<ArrayList<String>> stichpunkte; 

private LayoutInflater inflater; 


public MyListAdapter(Context context, List _ueberschriften, List _stichpunkte) { 

     this.ueberschriften = (ArrayList)_ueberschriften; 
     this.stichpunkte = (ArrayList)_stichpunkte; 

     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.item_child, null); 
     } 
     TextView tv = (TextView) convertView.findViewById(R.id.item_child_title); 
     tv.setText(liste_activity.getListe().getElement(groupPosition).getStichpunkt(childPosition)); 

     return convertView; 
    } 

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.item_group, null); 
    } 

    TextView tv = (TextView)convertView.findViewById(R.id.item_group_title); 
    tv.setText(liste_activity.getListe().getElement(groupPosition).getUeberschrift()); 

    return convertView; 
} 

使用notifyDataSetChanged()的:

Liste.deleteElement(groupPos); 
expListAdapter.notifyDataSetChanged(); 


非常感謝您的關注!

回答

4

你需要某種形式的DeleteMethod從手動Adapter添加到Adapter和刪除的項目,不僅從List刪除它。

每次使用notifyDataSetChanged()刷新視圖時,Adapter將調用圍繞List的循環。 Adapter中的List由於您所做的更改而得到空值。

+0

聽起來不錯!你能給我一個例子,因爲我不知道如何編寫一個適配器項目的刪除方法..? – OnClickListener 2012-02-13 12:58:06

+0

好的,我想通了,它的工作原理!這是我在我的ListAdapter DELETE方法代碼: \t'公共無效deleteItem(INT nummer){' \t \t'stichpunkte.remove(nummer);' \t \t'ueberschriften.remove(nummer);' \t '}' – OnClickListener 2012-02-13 13:35:29

+0

這就是我在我的主要活動中使用它的方法:'''''''''''''''''''''''''''''expListAdapter.notifyDataSetChanged();''expListAdapter.deleteItem(groupPos)'' – OnClickListener 2012-02-13 13:41:06

0

你應該叫expListAdapter.notifyDataSetInvalidated()

expListAdapter.notifyDataSetChanged()只會更新爲每個項目新的價值觀點(在任何元素沒有變化)

也就是說,它會再次打電話給你getChildViewgetGroupView每個項目。

+0

謝謝!但它仍然與相同的錯誤消息崩潰! – OnClickListener 2012-02-13 12:31:29

4

在您的registerDataSetObserver meke notifyDataSetChanged()中調用超級運行良好。

@Override 
public void registerDataSetObserver(DataSetObserver observer) { 
    super.registerDataSetObserver(observer);  
} 
相關問題