2016-05-17 44 views
0

我有一個ExpandableListView,它使用了非常原始的BaseExpandableListAdapter實現。它需要一個ArrayList和獲取數據,從該列表:ExpandableListView + BaseExpandableListAdapter:可以添加項目但無法清除列表

public class ListAdapter extends BaseExpandableListAdapter { 
    public ListAdapter (Context context, ArrayList<MyListItem> itemContainer) { 
     m_inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     m_items = itemContainer; 
    } 

    @Override 
    public int getGroupCount() { 
     return m_items.size(); 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return 1; 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return null; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return null; 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return 0; 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 
     return 0; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = m_inflater.inflate(R.layout.item_header, parent, false); 
     } 

     TextView label = (TextView) convertView.findViewById(R.id.itemHeader); 
     label.setText(String.valueOf(m_items.get(groupPosition).version) + " (" + m_items.get(groupPosition).date + ")"); 

     return convertView; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = m_inflater.inflate(R.layout.list_item, parent, false); 
     } 

     TextView label = (TextView) convertView.findViewById(R.id.item_description); 
     label.setText(m_items.get(groupPosition).description); 

     return convertView; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return false; 
    } 

    LayoutInflater m_inflater = null; 
    ArrayList<MyListItem> m_items = null; 
} 

活動舉行的「原始」 ArrayList<MyListItem>和操縱它。當一個項目被添加,它這樣做:

m_items.add(new ListItem(itemId, version, dateString, description)); 
m_listAdapter.notifyDataSetChanged(); 

而且工作。但清除列表並不是!

void clearList() { 
    m_items.clear(); 
    m_listAdapter.notifyDataSetChanged(); 
} 

我當然有檢查清除列表的代碼實際上是被調用的。所以有什麼問題?

+0

什麼是你的錯誤? –

+0

@AdrianOlar:正如我所說,沒有錯誤。調用'm_items.clear()'+'m_listAdapter.notifyDataSetChanged()'後,該列表不會變爲空。 –

+0

從你打電話的地方* m_items.clear(); *?在適配器內部? – Rami

回答

0

在你的方法,做在你的活動中清除數據的邏輯,補充一點:

public void clearList() 
    { 
     m_items.clear(); 
     m_listAdapter=new ListAdapter(this,m_items); 
     <your_expandableListView_name>.setAdapter(m_listAdapter) 
    } 
+0

爲什麼我需要創建一個新的適配器並再次將它傳遞給視圖?我已經有一個已經分配給視圖的適配器!我知道這個列表可以通過調用'setAdapter(null)'來清除,但它是愚蠢的,多餘的和非最優的。 –

+0

是的,它是非最優的,但它的工作原理。 notifyDatasetChanged()不工作可能有幾個原因,但這幾乎總是有效的。嘗試在'm_items.clear'之後的clearList()中加入:'m_items.addAll(new ArrayList ());'。 clearList()現在應該包含:'m_items.clear(); m_items.addAll(new ArrayList ()); m_listAdapter.notifyDataSetChanged();' – NezSpencer

相關問題