2012-03-28 10 views
26

के साथ क्रमबद्ध सूचीदृश्य मेरे पास एक कस्टम सरणी एडाप्टर से एक सूचीदृश्य है। इस सूची में एक TCP कनेक्शन जो डाटासेट में परिवर्तन से प्राप्त जानकारी से पता चलता ...सरणी एडाप्टर

मैं sort (Comparator<? super T> comparator) साथ सूचीदृश्य सॉर्ट करने के लिए, लेकिन जब डाटासेट बदल गया है, सूचीदृश्य नहीं क्रमबद्ध हो जाता है कर रहा हूँ ...

मैं डेटासेट बदलते समय हर बार sort() का उपयोग कर सकता हूं, लेकिन मुझे लगता है कि यह सबसे अच्छा विकल्प नहीं है ...

मैं यह कैसे कर सकता हूं? कोई सुझाव?

संपादित

कार्यान्वयन के लिए मैं समाधान प्रस्तुत करने में समस्या हो रही हूँ ...

MyComparatorB.java

public class MyComparatorB implements Comparator<DeviceB> { 

private byte orderType; 

public MyComparatorB(byte type) { 

    this.orderType = type; 

} 

public int compare(DeviceB lhs, DeviceB rhs) { 

    int res = 0; 
    if (orderType == SortType.ALPHA) { 
      res = (lhs.getName()).compareTo(rhs.getName()); 
     } 
     else if (orderType == SortType.LAST_ACT) { 
      res = (rhs.getTime().getTime()).compareTo(lhs.getTime().getTime()); 
     } 
     return res; 
    } 

} 

मेरी customArrayAdapter.java के स्निपेट

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
} 


//-----------Order the content of the arrayAdapter------------// 
public void sort(byte sortType) { 

    super.sort(new MyComparatorB(sortType)); 
    notifyDataSetChanged(); 
} 

मेरी MyActivity.java

myDevAdapter.sort(SortType.ALPHA); 

में जब मैं डिबगिंग कर रहा हूँ, विधि super.sort(new MyComparatorB(sortType)); कहा जाता है और MyComparatorB के निर्माता भी कहा जाता है। लेकिन विधि compare(DeviceB lhs, DeviceB rhs) कभी नहीं बुलाया जाता है और मेरी सरणी सूची को हल नहीं किया जाता है ... मैं क्या गलत कर रहा हूं?

+0

आप ArrayList का उपयोग क्यों नहीं करते हैं और सरणी को सॉर्ट करते हैं और सरणी सूची को पुनर्स्थापित करते हैं! – Behnam

+0

मुझे लगता है कि आपको अपनी सरणी को सॉर्ट करना चाहिए और adapter.notifyDataSetChanged() –

+0

@amp: सॉर्ट टाइप यहां क्या है? – YuDroid

उत्तर

38

मैं तुम सही अपने सुपर कॉल करने से पहले notifyDataSetChanged अपने एडाप्टर में विधि ओवरराइड और छँटाई करने की आवश्यकता है लगता है। नीचे देखें:

@Override 
public void notifyDataSetChanged() { 
    //do your sorting here 

    super.notifyDataSetChanged(); 
} 

ऐसा करने से सूची को सॉर्ट होगा जब भी आप सूची आइटम को ताज़ा करने के notifyDataSetChanged विधि कॉल। अन्यथा, अपने एडाप्टर में एक क्रमबद्ध सूची/सरणी फ़ीड करें।


या अधिक बेहतर, काम करवाने के लिए अपने एडाप्टर में sort विधि उपलब्ध का उपयोग करें।

adapter.sort(new Comparator<String>() { 
    @Override 
    public int compare(String lhs, String rhs) { 
     return lhs.compareTo(rhs); //or whatever your sorting algorithm 
    } 
}); 
+0

डेटासेट बदलने के हर बार 'super.sort (तुलनित्र) विधि को कॉल करने का एकमात्र तरीका है? – amp

+0

हां, super.notifyDataSetChanged को कॉल करने से पहले इसे जोड़ें, ताकि आपका डेटा हर बार – waqaslam

+19

सॉर्ट किया गया हो .sort फ़ंक्शन स्वचालित रूप से सूचित करता हैडेटासेट चेंज किया जाता है, इसलिए यदि आप अंतर्निहित प्रकार के साथ इस कोड का उपयोग करते हैं, तो आप एक अनंत लूप और ओवरफ़्लो में पहुंच जाएंगे तुम्हारा ढेर केवल तभी ऐसा करें जब आप स्वयं सूची को प्रबंधित कर रहे हों, लेकिन अधिकांश लोग ऐरे एडाप्टर का उपयोग कर ऐसा नहीं कर रहे हैं। – elBradford

0

चूंकि ListView भरने वाला एडाप्टर है, इसलिए डेटा ऑब्जेक्ट को क्रमबद्ध तरीके से पास करना एकमात्र तरीका है।

0

सूची दृश्य को सॉर्ट करने के बाद, अपनी गतिविधि से adapter.notifyDataSetChanged() को कॉल करें।

5
  • एक ArrayList
  • संलग्न सरणी के लिए स्टोर डेटा
  • क्रमबद्ध सरणी अनुकूलक और खुद को सौंपे जाने के
  • उपयोग notifyDataSetChanged() एडाप्टर ताज़ा करने के लिए
3

यह मैं

लिए काम करता है
@Override 
public void notifyDataSetChanged() { 
    this.setNotifyOnChange(false); 

    this.sort(new Comparator<String>() { 
     @Override 
     public int compare(String lhs, String rhs) { 
      return lhs.compareTo(rhs); 
     } 
    }); 

    this.setNotifyOnChange(true); 
} 
0

प्रति एलब्राडफोर्ड की टिप्पणी के बारे में टिप्पणी NotifyDataSetChanged() दृष्टिकोण से उत्पन्न स्टैक ओवरफ़्लो के लिए संभावित, मैं यह सुनिश्चित करने के लिए ArrayAdapter की ऐड() विधि को ओवरराइड करना समाप्त कर देता हूं ताकि आइटम एक क्रमबद्ध स्थिरता बनाए रख सकें जब एक-एक करके जोड़ा जा सके। (addAll को कॉल करते समय() मैं पहले से आइटम को सॉर्ट कर रहा हूं, लेकिन मुझे लगता है कि आप addAll() को ओवरराइड कर सकते हैं)।

@Override 
    public void add(ListThing object) { 
     super.add(object); 
     this.sort(ListThing.sComparator); 
    } 
0

पर waqaslam और KristianR के जवाब के आधार:

@Override 
public void notifyDataSetChanged() { 
    this.setNotifyOnChange(false); 

    this.sort(new Comparator<String>() { 

     @Override 
     public int compare(String s1, String s2) { 
      return s1.compareTo(s2); 
     } 
    }); 

    super.notifyDataSetChanged(); 
    this.setNotifyOnChange(true); 
} 

आशा है कि यह मदद करता है।

संबंधित मुद्दे