2017-01-11 3 views
7

मैं निम्नलिखित rowHasChanged के साथ एक ListView है कि एक (Whatsapp/फेसबुक मैसेंजर के समान) चैट सत्रों की सूची प्रदर्शित करती है, अगर मैं shouldComponentUpdate का उपयोग करता हूं।ListView सॉर्टिंग प्रदर्शन को कैसे संभालें? यहां तक ​​कि</p> <pre><code>rowHasChanged: (r1, r2) => r1.id !== r2.id </code></pre> <p>मैंने देखा है कि आइटम है कि अद्यतन नहीं किया जा रहा है हो रही है फिर से गाया जाता है,:

कुछ निशानों के बाद मुझे पता चला कि क्योंकि मैं डेटा स्रोत को क्लोन करने से पहले आइटम को अलग करता हूं (नया संदेश आइटम सूची के शीर्ष पर कूदता है), rowHasChanged विभिन्न पंक्तियों की तुलना कर रहा है। ऐसा करने के लिए यह समझ में आता है।

लेकिन क्या प्रदर्शन करने के तरीके में सॉर्टिंग का समर्थन करने के लिए इसका कोई समाधान नहीं है? डब्ल्यूपीएफ में हमारे पास CollectionViewSource था जो उसी समस्या के कारण something to sort by प्राप्त हुआ था (फ़िल्टरिंग और अन्य समर्थित भी)।

क्या कोई इन अनावश्यक renders से छुटकारा पाने के लिए एक तरीका पता है?

+0

'ListViewDataSource' अपरिवर्तनीय डेटा का उपयोग करता है, इसलिए मुझे नहीं लगता कि यह' ListView' का उपयोग करके संभव होगा। हालांकि, अगर आपके पास 'removeClippedSubviews' सक्षम है, तो ऐसा प्रतीत नहीं होता है कि यह बहुत सारी पंक्तियों को प्रस्तुत करना चाहिए। क्या आपने कोशिश की है? –

+0

@GarrettMcCullough समस्या अपरिवर्तनीय डेटा या बहुत अधिक पंक्तियों को प्रस्तुत करने के बारे में नहीं है। यह है कि जब एक पंक्ति अपनी स्थिति बदलती है तो यह अन्य सभी पंक्तियों को मेरे डेटा में अपनी स्थिति बदलने का कारण बनती है, जिससे सूची दृश्यों को पंक्तियों के रूप में सभी पंक्तियों को समझने का कारण बनता है क्योंकि यह अलग-अलग पंक्तियों की तुलना एक-दूसरे से कर रहा है। –

+0

मोती, मेरी टिप्पणी का कहना था कि क्योंकि आप एक अपरिवर्तनीय डेटा ऑब्जेक्ट का उपयोग कर रहे हैं, कतार के सामने एक नया रिकॉर्ड दबाकर * डेटा संरचना बदल रहा है और इसलिए प्रत्येक पंक्ति को फिर से प्रस्तुत करने की आवश्यकता होगी क्योंकि डेटा संरचना अब अलग है। हालांकि, अगर आपके पास 'removeClippedSubviews' चालू है, तो यह वास्तव में कोई फर्क नहीं पड़ता कि आप सभी पंक्तियों को फिर से प्रस्तुत कर रहे हैं क्योंकि आप केवल दृश्य पंक्तियों को फिर से प्रस्तुत करेंगे (साथ ही कुछ तरफ कुछ अतिरिक्त) यह एक प्रदर्शन मुद्दा नहीं होना चाहिए। आप कुछ सूची दृश्य विकल्पों को भी देख सकते हैं –

उत्तर

0

क्या आप इस तरह डेटा स्रोत का उपयोग कर रहे हैं? इस तरह का उपयोग करने के

this.setState({ 
 
    dataSource: this.ds.cloneWithRows(rowData) 
 
});

प्रयास करें:

this.setState(state => ({ 
 
    dataSource: this.state.dataSource.cloneWithRows(rowData) 
 
}))

पहले sutiation में, आप डेटा स्रोत के लिए एक नया मान सेट कर रहे हैं, तो यह जीता rowHasChanged का उपयोग नहीं करते हैं, और इसे एक नए डेटा स्रोत की तरह लेता है।

+0

नहीं, मैं लगातार राज्य से अपने डेटा स्रोत का उपयोग कर रहा था। मुद्दा पंक्ति के बारे में नहीं है, यह तथ्य है कि आप सूची दृश्य को सॉर्ट नहीं कर सकते हैं, संभवतः अनावश्यक पुन: प्रस्तुत करने के कारण, क्योंकि पंक्ति तुलना पूरी तरह से सूचकांक आधारित है। –

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