Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Mobil uygulamalar yazarken performans önemlidir. Kullanıcılar sorunsuz kaydırma ve hızlı yükleme süreleri beklemeye başladı. Kullanıcılarınızın beklentilerini karşılamamak, uygulama mağazasında derecelendirmelere veya bir iş kolu uygulaması söz konusu olduğunda kuruluşunuzun zamanına ve parasına mal olur.
Xamarin.FormsListView, verileri görüntülemek için güçlü bir görünümdür, ancak bazı sınırlamaları vardır. Özellikle iç içe görünüm hiyerarşileri içerdiklerinde veya karmaşık ölçüm gerektiren belirli düzenleri kullandıklarında, özel hücreler kullanılırken kaydırma performansı zarar görebilir. Neyse ki, düşük performansı önlemek için kullanabileceğiniz teknikler vardır.
Önbelleğe alma stratejisi
ListViews genellikle ekrana sığandan çok daha fazla veri görüntülemek için kullanılır. Örneğin, bir müzik uygulamasının binlerce girişi olan bir şarkı kitaplığı olabilir. Her giriş için bir öğe oluşturmak değerli belleği boşa harcar ve kötü performans gösterir. Satırları sürekli oluşturmak ve yok etmek, uygulamanın nesneleri sürekli olarak örneklemesini ve temizlemesini gerektirir ve bu da kötü performans gösterir.
Belleği korumak için, her platformun yerel ListView eşdeğerleri satırları yeniden kullanmak için yerleşik özelliklere sahiptir. Yalnızca ekranda görünen hücreler belleğe yüklenir ve içerik mevcut hücrelere yüklenir. Bu düzen, uygulamanın binlerce nesnenin örneğini oluşturmasını ve zamandan ve bellekten tasarruf etmesini engeller.
Xamarin.FormsListView aşağıdaki değerlere sahip sabit listesi aracılığıyla hücrenin ListViewCachingStrategy yeniden kullanılmasına izin verir:
public enum ListViewCachingStrategy
{
RetainElement, // the default value
RecycleElement,
RecycleElementAndDataTemplate
}
Not
Evrensel Windows Platformu (UWP), performansı geliştirmek için her zaman önbelleğe alma kullandığından önbelleğe alma stratejisini yoksayarRetainElement. Bu nedenle, varsayılan olarak önbelleğe alma stratejisi uygulanmış gibi RecycleElement davranır.
RetainElement
RetainElement Önbelleğe alma stratejisi, öğesinin ListView listedeki her öğe için bir hücre oluşturacağını belirtir ve varsayılan ListView davranıştır. Aşağıdaki durumlarda kullanılmalıdır:
- Her hücrenin çok sayıda bağlaması vardır (20-30+).
- Hücre şablonu sık sık değişir.
- Test, önbelleğe alma stratejisinin
RecycleElementyürütme hızının azalmasına neden olduğunu gösterir.
Özel hücrelerle çalışırken önbelleğe alma stratejisinin RetainElement sonuçlarını tanımak önemlidir. Herhangi bir hücre başlatma kodunun her hücre oluşturma işlemi için çalıştırılması gerekir ve bu da saniyede birden çok kez olabilir. Bu durumda, birden çok iç içe StackLayout örnek kullanmak gibi bir sayfada iyi olan düzen teknikleri, kullanıcı kaydırılırken gerçek zamanlı olarak ayarlandığında ve yok edildiğinde performans sorunlarına dönüşür.
RecycleElement
RecycleElement Önbelleğe alma stratejisi, liste hücrelerini geri dönüştürerek bellek ayak izini ve yürütme hızını en aza indirmeye çalışacağını belirtirListView. Bu mod her zaman bir performans iyileştirmesi sunmaz ve herhangi bir iyileştirmeyi belirlemek için test gerçekleştirilmelidir. Ancak tercih edilen seçimdir ve aşağıdaki durumlarda kullanılmalıdır:
- Her hücrenin az veya orta sayıda bağlaması vardır.
- Her hücre
BindingContexttüm hücre verilerini tanımlar. - Her hücre büyük ölçüde benzerdir ve hücre şablonu değişmez.
Sanallaştırma sırasında hücrenin bağlama bağlamı güncelleştirilir ve bu nedenle bir uygulama bu modu kullanıyorsa bağlama bağlamı güncelleştirmelerinin uygun şekilde işlendiğinden emin olmalıdır. Hücreyle ilgili tüm veriler bağlama bağlamından gelmelidir veya tutarlılık hataları oluşabilir. Bu sorun, hücre verilerini görüntülemek için veri bağlama kullanılarak önlenebilir. Alternatif olarak, hücre verileri aşağıdaki kod örneğinde OnBindingContextChanged gösterildiği gibi özel hücrenin oluşturucusunda değil geçersiz kılmada ayarlanmalıdır:
public class CustomCell : ViewCell
{
Image image = null;
public CustomCell ()
{
image = new Image();
View = image;
}
protected override void OnBindingContextChanged ()
{
base.OnBindingContextChanged ();
var item = BindingContext as ImageItem;
if (item != null) {
image.Source = item.ImageUrl;
}
}
}
Daha fazla bilgi için bkz . Bağlama Bağlam Değişiklikleri.
iOS ve Android'de hücreler özel işleyiciler kullanıyorsa, özellik değişikliği bildiriminin doğru uygulandığını güvence altına almaları gerekir. Hücreler yeniden kullanıldığında, bağlama bağlamı kullanılabilir bir hücreye PropertyChanged güncelleştirildiğinde ve olaylar tetiklendiğinde özellik değerleri değişir. Daha fazla bilgi için bkz . ViewCell'i Özelleştirme.
DataTemplateSelector ile RecycleElement
bir ListView öğesini seçmek için bir DataTemplateSelector DataTemplatekullandığında RecycleElement , önbelleğe alma stratejisi önbelleğe DataTemplatealınmaz. Bunun yerine, listedeki her veri öğesi için bir DataTemplate seçilir.
Not
RecycleElement Önbelleğe alma stratejisinin, 2.4'te Xamarin.Forms kullanıma sunulan bir önkoşulu vardır ve her birinin aynı ViewCell türde döndürmesi gereken bir DataTemplate DataTemplate seçim istenirseDataTemplateSelector. Örneğin, döndürebilen bir ile verilen ListView (türünde MyViewCellAbir döndürdüğü), MyDataTemplateA veya MyDataTemplateB (türünde MyDataTemplateB bir ViewCell ViewCell MyViewCellBdöndürür), döndürüldüğünde MyDataTemplateA döndürülmesi MyViewCellA gerekir veya bir özel durum oluşturulur.DataTemplateSelector MyDataTemplateA
RecycleElementAndDataTemplate
RecycleElementAndDataTemplate Önbelleğe alma stratejisiRecycleElement, bir öğesini seçmek DataTemplateDataTemplateiçin bir DataTemplateSelector kullandığında ListView listedeki öğe türüne göre önbelleğe alınmasını sağlayarak önbelleğe alma stratejisini oluşturur. Bu nedenle, DataTemplateöğe örneği başına bir kez değil, öğe türü başına bir kez seçilir.
Not
RecycleElementAndDataTemplate Önbelleğe alma stratejisinin, tarafından DataTemplateSelector döndürülenlerin bir alan oluşturucuyu DataTemplate kullanması gereken bir Typeönkoşulu DataTemplatevardır.
Önbelleğe alma stratejisini ayarlama
Numaralandırma ListViewCachingStrategy değeri, aşağıdaki kod örneğinde gösterildiği gibi bir ListView oluşturucu aşırı yüklemesiyle belirtilir:
var listView = new ListView(ListViewCachingStrategy.RecycleElement);
XAML'de özniteliğini CachingStrategy aşağıdaki XAML'de gösterildiği gibi ayarlayın:
<ListView CachingStrategy="RecycleElement">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
...
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Bu yöntem, C# içindeki oluşturucuda önbelleğe alma stratejisi bağımsız değişkenini ayarlamakla aynı etkiye sahiptir.
Alt sınıf listview'da önbelleğe alma stratejisini ayarlama
özniteliğini CachingStrategy alt sınıflandırılmış ListView bir XAML'den ayarlamak istenen davranışı oluşturmaz çünkü üzerinde ListViewözelliği yokturCachingStrategy. Ayrıca, XAMLC etkinleştirilirse şu hata iletisi oluşturulur: 'CachingStrategy' için özellik, bağlanabilir özellik veya olay bulunamadı
Bu sorunun çözümü, alt sınıfta ListView parametre kabul eden ve bunu temel sınıfa geçiren bir ListViewCachingStrategy oluşturucu belirtmektir:
public class CustomListView : ListView
{
public CustomListView (ListViewCachingStrategy strategy) : base (strategy)
{
}
...
}
ListViewCachingStrategy Ardından numaralandırma değeri XAML'den söz dizimi kullanılarak x:Arguments belirtilebilir:
<local:CustomListView>
<x:Arguments>
<ListViewCachingStrategy>RecycleElement</ListViewCachingStrategy>
</x:Arguments>
</local:CustomListView>
ListView performans önerileri
bir performansını geliştirmek ListViewiçin birçok teknik vardır. Aşağıdaki öneriler ListView'unuzun performansını artırabilir
- Koleksiyonlar
ItemsSourcerastgele erişimi desteklemediğindenIEnumerable<T>özelliğiniIList<T>koleksiyon yerine birIEnumerable<T>koleksiyona bağlayın. - Mümkün olduğunda yerine
ViewCellyerleşik hücreleri (örneğinSwitchCellTextCell/ ) kullanın. - Daha az öğe kullanın. Örneğin, birden çok etiket yerine tek
FormattedStringbir etiket kullanmayı göz önünde bulundurun. ListViewöğesini, homojen olmayan verileri (başka birTableViewifadeyle farklı türlerdeki verileri) görüntülerken ile değiştirin.- yönteminin
Cell.ForceUpdateSizekullanımını sınırlayın. Fazla kullanıldıysa performansı düşürür. - Android'de, büyük bir performans cezasına neden olduğundan, örneğin oluşturulduktan sonra bir
ListViewsatır ayırıcı görünürlüğü veya rengi ayarlamaktan kaçının. - hücre düzenini temel
BindingContextalarak değiştirmekten kaçının. Düzenin değiştirilmesi büyük ölçüm ve başlatma maliyetlerine neden olur. - İç içe yerleştirilmiş düzen hiyerarşilerinden kaçının. İç içe yerleştirmeyi azaltmaya yardımcı olmak için veya
GridkullanınAbsoluteLayout. - dışında belirli
LayoutOptionsFillbir şeyden kaçının (Fillişlem için en ucuzdur). - Aşağıdaki nedenlerden dolayı içine bir
ListViewScrollViewyerleştirmekten kaçının:- kendi
ListViewkaydırmasını uygular. ListViewüstScrollViewtarafından işlenecekleri için herhangi bir hareket almaz.- ,
ListViewlistenin öğeleriyle birlikte kaydırılan özelleştirilmiş bir üst bilgi ve alt bilgi sunabilir ve bunun için kullanıldığı işlevselliğiScrollViewsunma olasılığı vardır. Daha fazla bilgi için bkz . Üst Bilgiler ve Alt Bilgiler.
- kendi
- Hücrelerinizde belirli, karmaşık bir tasarıma ihtiyacınız varsa özel işleyiciyi göz önünde bulundurun.
AbsoluteLayout tek bir ölçü çağrısı olmadan düzenleri gerçekleştirme potansiyeline sahiptir ve bu da yüksek performansa sahiptir. Kullanılamıyorsa AbsoluteLayout göz önünde bulundurun RelativeLayout. kullanıyorsanız RelativeLayoutKısıtlamaları doğrudan geçirmek, ifade API'sini kullanmaktan çok daha hızlı olacaktır. İfade API'sinin JIT kullanması ve iOS'ta ağacın daha yavaş yorumlanması gerektiğinden bu yöntem daha hızlıdır. İfade API'si, yalnızca ilk düzende ve döndürmede gerekli olduğu sayfa düzenleri için uygundur, ancak ListViewiçinde kaydırma sırasında sürekli çalıştırıldığında performansa zarar verir.
Bir veya hücreleri için ListView özel işleyici oluşturmak, düzen hesaplamalarının kaydırma performansı üzerindeki etkisini azaltmaya yönelik bir yaklaşımdır. Daha fazla bilgi için bkz . ListView'ı Özelleştirme ve ViewCell'i Özelleştirme.