ListView aslında kendisini tüm öğeleri görüntüleyecek kadar uzun olacak şekilde ölçebiliyor, ancak wrap_content'i (MeasureSpec.UNSPECIFIED) belirttiğinizde bunu yapmıyor. MeasureSpec.AT_MOST ile bir yükseklik verildiğinde bunu yapar. Bu bilgi ile, yukarıda yayınlanan çözümlerden çok daha iyi çalışan bu sorunu çözmek için çok basit bir alt sınıf oluşturabilirsiniz. Yine de bu alt sınıfla wrap_content kullanmalısınız.
public class ListViewForEmbeddingInScrollView extends ListView {
public ListViewForEmbeddingInScrollView(Context context) {
super(context);
}
public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 4, MeasureSpec.AT_MOST));
}
}
HeightMeasureSpec öğesinin çok büyük boyutlu (Integer.MAX_VALUE >> 4) AT_MOST olması, ListView öğesinin tüm çocuklarını belirli (çok büyük) yüksekliğe kadar ölçmesine ve yüksekliğini buna göre ayarlamasına neden olur.
Bu, birkaç nedenden ötürü diğer çözümlerden daha iyi çalışır:
- Her şeyi doğru ölçer (dolgu, bölücüler)
- Ölçüm geçişi sırasında ListView'i ölçer
- # 2 nedeniyle, herhangi bir ek kod olmadan genişlik veya öğe sayısındaki değişiklikleri doğru şekilde işler
Dezavantajlı olarak, bunu yapmanın SDK'daki değişebilecek davranışsız davranışlara dayandığını iddia edebilirsiniz. Öte yandan, wrap_content'ın ListView ile gerçekten nasıl çalışması gerektiğini ve mevcut wrap_content davranışının sadece bozulduğunu iddia edebilirsiniz.
Davranışın ileride değişebileceğinden endişe ediyorsanız, onMeasure işlevini ve ilgili işlevleri ListView.java'dan ve kendi alt sınıfınıza kopyalamanız, ardından ONMMOST yolundaki AT_MOST yolunu UNSPECIFIED için de çalıştırmanız gerekir.
Bu arada, az sayıda liste öğesiyle çalışırken bunun tamamen geçerli bir yaklaşım olduğuna inanıyorum. LinearLayout ile karşılaştırıldığında verimsiz olabilir, ancak öğe sayısı az olduğunda, LinearLayout'u kullanmak gereksiz optimizasyon ve dolayısıyla gereksiz karmaşıklıktır.