2012-02-13 23 views
8

पहले एक छोटी सिंहावलोकन मेरी कोड के, मैं आशा है कि अपनी समझ में आता है:अद्यतन कर रहा है ExpandableListView()

  • मैं एक वर्ग में कुछ चर के साथ ToDoElement कहा जाता है।
  • मेरे पास ToDoListe नामक एक और वर्ग है जो एक ArrayList में ToDoElement एस प्रबंधित करता है।
  • ToDoListe विधि deleteElement() अपने मुख्य गतिविधि में
  • ArrayList से एक ToDoElement नष्ट करने के लिए होता है liste_activity मैं ToDoListe की एक वस्तु बना सकते हैं और ToDoElement में से कुछ वस्तुओं के साथ भरें।
  • उसी गतिविधि में मेरे पास अपने स्वयं के एडाप्टर के साथ एक विस्तारणीय लिस्ट व्यू है जिसे expListAdapter कहा जाता है।
  • एडाप्टर ToDoElement एस के स्ट्रिंग चर प्राप्त करके ग्रुपव्यू और चाइल्डव्यूज़ बनाता है।
  • मैंने सूची के प्रत्येक समूह आइटम के लिए एक कॉन्टेक्स्टमेनू बनाया, जिसमें मैं deleteElement() विधि का उपयोग करता हूं।

    मैं विधि deleteElement() मैं अपने सूची को अपडेट करना चाहते इस्तेमाल किया के बाद, क्योंकि ToDoListe में ArrayList के डेटा बदल:

ठीक है, अब यहाँ मेरी समस्या है। तो मैं expListAdapter.notifyDataSetChanged() पर कॉल करता हूं।
लेकिन फिर मेरी पूरी गतिविधि दुर्घटनाग्रस्त हो जाती है: "इंडेक्सऑटऑफबाउंड अपवाद: अमान्य अनुक्रमणिका 4, आकार 4" (मेरे पास 5 में सेआइटम मेरी सूची में था, उनमें से एक को हटाने से पहले)।
मुझे पता है कि मेरे लिए एक लूप के कारण है, लेकिन मुझे कोई विचार नहीं है कि क्यों।

कोड टुकड़े:

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); 

सूची एडाप्टर के लिए ArrayLists बनाएँ:

// 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

आप Adapter मैन्युअल रूप से आइटम Adapter को किसी प्रकार की DeleteMethod जोड़ सकते हैं और दूर करने के लिए की जरूरत है, न केवल यह List से हटा दें।

प्रत्येक बार जब आप notifyDataSetChanged()Adapter का उपयोग करके विचारों को रीफ्रेश करते हैं तो List के आसपास लूप को कॉल करेंगे। आपके ListAdapter में आपके द्वारा किए गए परिवर्तनों के कारण शून्य मूल्य प्राप्त होता है।

+0

अच्छा लगता है! क्या आप मुझे एक उदाहरण दे सकते हैं, क्योंकि मुझे नहीं पता कि एडाप्टर आइटम के लिए डिलीट विधि कैसे लिखना है ..? – OnClickListener

+0

ठीक है, मैंने इसे समझ लिया, यह काम करता है! ; ' \t \t' ueberschriften.remove (nummer); ' \t \t' सार्वजनिक शून्य deleteItem (पूर्णांक nummer) { ' \t \t' stichpunkte.remove (nummer): यहाँ मेरी ListAdapter में हटाएं विधि के लिए मेरे कोड है '}' – OnClickListener

+0

और इस प्रकार मैं इसे अपनी मुख्य गतिविधि में उपयोग करता हूं: 'Liste.deleteElement (groupPos); '' expListAdapter.deleteItem (groupPos); '' expListAdapter.notifyDataSetChanged(); ' – OnClickListener

0

आप बुलाना चाहिए expListAdapter.notifyDataSetInvalidated()

expListAdapter.notifyDataSetChanged() बस प्रत्येक आइटम के लिए नए मूल्यों के लिए अपने विचार (तत्वों में से किसी में कोई परिवर्तन नहीं)

अद्यतन करेगा यानी इसे फिर से प्रत्येक आइटम के लिए अपने getChildView और getGroupView कॉल करेंगे ।

+0

धन्यवाद! लेकिन यह अभी भी एक ही त्रुटि संदेश के साथ दुर्घटनाग्रस्त हो जाता है! – OnClickListener

4

अपने रजिस्टर में सुपर कॉल करेंडेटासेटर्स मेके अधिसूचनाडेटासेट चेंज() अच्छी तरह से काम कर रहा है।

@Override 
public void registerDataSetObserver(DataSetObserver observer) { 
    super.registerDataSetObserver(observer);  
} 
संबंधित मुद्दे