2017-01-11 20 views
7

aşağıdaki rowHasChanged ile, (Whatsapp/Facebook Messenger benzer) sohbet oturumları listesini görüntüleyen bir ListView var:ListView sıralama performansı nasıl kullanılır?

rowHasChanged: (r1, r2) => r1.id !== r2.id 

Ben güncellenmektedir almayan öğelerin yeniden render alıyorsanız fark, hatta shouldComponentUpdate kullanırsam.

Bazı bulgular olduktan sonra, dataSource'u klonlamaya başlamadan önce öğeleri farklı şekilde sıraladığımdan (yeni ileti, öğeler listenin en üstüne atlar), rowHasChanged farklı satırları karşılaştırıyor. Bunu yapması mantıklı.

Ancak, bir sıralamada sıralamayı desteklemek için bir çözüm yok mu? WPF'de, something to sort by no'lu CollectionViewSource no'lu veriye ek olarak, aynı sorundan dolayı verilere ek olarak (aynı zamanda desteklenen filtreleme ve diğerleri).

Bu gereksiz işleyicilerinden kurtulmanın bir yolu var mı?

+0

ListViewDataSource, değişmez verileri kullanır, bu yüzden bir "ListView" kullanılarak mümkün olacağını düşünmüyorum. Ancak, "removeClippedSubviews" etkinse, çok fazla satır oluşturması gerektiği görünmüyor. Bunu denedin mi? –

+0

@GarrettMcCullough Sorun, değişmez veriler veya çok fazla satır oluşturma ile ilgili değil. Bu, bir satırın konumunu değiştirdiğinde, diğer tüm satırların benim verilerimde konumlarını değiştirmesine neden olur, bu da ListView'in farklı satırları birbiriyle karşılaştırması nedeniyle TÜM satırların değiştirilen satırlar olarak sayılmasına neden olur. –

+0

Moti, yorumum, değişmez bir veri nesnesi kullandığınız için, sıranın önüne yeni bir kaydın itildiğini * belirtiyordu. * Veri yapısını değiştiriyor ve bu nedenle her satırın yeniden oluşturulmasını gerektiriyor. veri yapısı artık farklı. Ancak, "removeClippedSubviews" özelliği açıksa, tüm satırları yeniden oluşturduğunuzun önemi yoktur, çünkü yalnızca görünen satırları (her iki tarafa da birkaç tane ekstra) yeniden oluşturacaksınız. bir performans sorununa neden olmamalıdır. ListView alternatiflerinden bazılarına da bakabilirsiniz. –

cevap

0

Bu gibi dataSource kullanıyor musunuz?

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

deneyin böyle kullanmak: o kazandı böylece

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

ilk sutiation, sen, dataSource yeni bir değer hazırsınız rowHasChanged kullanmayın ve yeni bir dataSource gibi alır.

+0

Hayır, veri kaynağımı sürekli olarak eyaletten kullanıyordum. Sorun, rowHasChanged ile ilgili değil, satır karşılaştırması yalnızca dizin tabanlı olduğundan, muhtemelen gereksiz yeniden oluşturuculara neden olmadan ListView'i sıralayamamanızla ilgili. –