5

रीसाइक्लर व्यू लाइब्रेरी ने हाल ही में नया SortedList क्लास जोड़ा है। मान लीजिए मेरे पास एक कॉलबैक है जो compare() विधि लागू करता है जो समय के साथ बदल सकता है, यानी अंतर्निहित तुलनाकर्ता को स्विच किया जा सकता है। अपने डेटा का पूरी तरह से रिसॉर्ट करने के लिए SortedList बताने का सबसे अच्छा तरीका क्या है?रीसाइक्लिंग व्यू की सॉर्टेडलिस्ट

+1

अगर मुझे लगता है, 'startBatchedUpdates() ',' realculatePositionOfItemAt() '(प्रत्येक आइटम के लिए), और' endBatchedUpdates() ', लेकिन यह केवल एपीआई के आधार पर अनुमान है। – CommonsWare

+0

सबसे खराब केस परिदृश्य, http://developer.android.com/reference/android/support/v7/widget/util/SortedListAdapterCallback.html कॉलबैक में तत्व बदलने के तरीकों के तरीके हैं, लेकिन सही उत्तर शायद @ कॉमन्सवेयर ' जवाब – EpicPandaForce

+0

यह एक बुरी शुरुआत नहीं है। लेकिन प्रत्येक इंडेक्स के लिए realculatePositionOfItemAt() को कॉल करना पूरी तरह से इसका सहारा नहीं लेगा। सूचकांक बदल जाएंगे जिससे कुछ वस्तुओं को छोड़ दिया जा सकता है। –

उत्तर

1

यहाँ उस पर अपने ही ले (Kotlin में लिखा) है:

list.beginBatchedUpdates() 

val indices = (0..list.size() - 1).toArrayList() 

while (!indices.isEmpty()) { 
    val i = indices.first() 
    val item = list.get(i) 

    list.recalculatePositionOfItemAt(i) 

    [suppress("USELESS_CAST_STATIC_ASSERT_IS_FINE")] 
    indices.remove(list.indexOf(item) as Any) //cast to disambiguate remove() 
} 

list.endBatchedUpdates() 

आप देखते हैं, मैं recalculatePositionOfItemAt() तो हर आइटम केवल एक बार सहारा है और कोई आइटम के लिए हर कॉल के बाद नया सूचकांक ट्रैकिंग कर रहा हूँ कर सकते हैं छोड़ दिया गया है

यह काम करता है लेकिन वास्तव में अपर्याप्त लगता है क्योंकि recalculatePositionOfItemAt() निकालने के लिए दो बार अंतर्निहित सरणी का आकार बदल देगा और फिर आइटम को पढ़ेगा। indexOf तब भी एक नई बाइनरी खोज करेगा, हालांकि इंडेक्स पहले ही ज्ञात है।

संपादित करें: यदि आइटम बराबर की तुलना में एक अनंत लूप का कारण बनता है।

वैकल्पिक दृष्टिकोण (सभी हटाने, तो सभी को जोड़ने):

list.beginBatchedUpdates() 

val copy = (list.size() - 1 downTo 0).map { list.removeItemAt(it) } 
copy.forEach { list.add(it) } 

list.endBatchedUpdates() 
0

दुर्भाग्य से, वहाँ इस के लिए कोई एपीआई है। बस स्रोत कॉपी करें और उस विधि को स्वयं जोड़ें। बैकिंग डेटा सिर्फ एक सरणी है ताकि आप उस पर Arrays.sort को कॉल कर सकें, फिर डेटा सेट को सूचित करें कॉल करें। ट्रैकिंग परिवर्तन छोटे नहीं होते हैं जब पूरी दुनिया बदलती है तो क्रमबद्ध सूची के लिए वास्तव में उपयुक्त मामला नहीं है। कृपया b.Android.com पर एक सुविधा अनुरोध बनाएं।

+0

हाँ, मुझे एहसास हुआ कि 5 से अधिक वस्तुओं पर एक पूर्ण रिसॉर्टिंग एनिमेटिंग वास्तव में अजीब लग रहा है। –

+0

बीटीडब्ल्यू, आपको स्रोत की प्रतिलिपि बनाने की आवश्यकता नहीं है। चूंकि अंतर्निहित सरणी mData पैकेज निजी है, इसलिए आप उसी पैकेज में एक सहायक के माध्यम से इसका उपयोग कर सकते हैं। –

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