2014-09-12 36 views
7

Bu görünümü şişiriyorum ve ListView'üme başlık olarak ekliyorum. Ben onun başlığının Authoritah saygı duymayan (bu örnekte uğruna, sert kodlu) yüksek 500dpListView üstbilgisi ignores layout_height

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" 
       android:layout_width="match_parent" android:background="@drawable/repeat_background" 
       android:layout_height="500dp"> 

    <ImageView android:id="@+id/filter_menu" android:src="@drawable/ic_sort" 
       android:layout_gravity="center_vertical" android:padding="8dp" 
       android:layout_weight="0" 
       android:layout_width="wrap_content" android:layout_height="wrap_content" 
       android:onClick="showPopup"/> 

</LinearLayout> 

ListView yapmaya çalışıyorum ve içeriği üzerine sarar duyuyorum. Herkes ne olduğunu açıklayabilir mi?

cevap

12

Neler olup bittiğini anlamanın anahtarı, ListView üstbilgileri ve altbilgileri nasıl uygulandığını bulmaktır. Bunlar bir numara: ListView'inize ilk üstbilgi veya altbilgi eklediğiniz an, ListAdapter ürününüz HeaderViewListAdapter (line 270 of ListView.java üzerinde gerçekleşir). HeaderListViewAdapter, üstbilgileri ve altbilgileri içerecek şekilde count ve position değerlerini ayarlayan bir liste bağdaştırıcısıdır; üstbilgiler ve altbilgiler, sistemin sizin için yönettiği normal liste öğeleri olur.

line 207 of HeaderListViewAdapter.java'a bakarsanız, bir üstbilgi veya altbilgi eklerken getView uygulamasının görünümünün yok saydığını görürsünüz. Bu, mLayoutParams'un XML'den başlatılmamasına neden olur (kaynak koduna gerçekten işaret edemez, sadece zaman içinde öğrendiğim bir şey).

sonra line 2237 of AbsListView.java geçmiş biraz getView çağrıları, izleyin ve bir süre obtainView çağrılarını takip ve line 1182 of ListView.java en sonunda (Ben az önce yaptığım budur) LayoutParams ararsanız. Burada çocuk görüntüleme ölçülen zaman düzen parametreler null ise, bu line 6065 of AbsListView.java üzerine uygulandığı, generateDefaultLayoutParams() seslenir, görüyoruz:

@Override 
protected ViewGroup.LayoutParams generateDefaultLayoutParams() { 
    return new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT, 0); 
} 

... ve senin WRAP_CONTENT nereden geldiğini budur .

Kolay bir çalışma ortamı olarak, XML'inizin <LinearLayout/> ürününü <FrameLayout/> içine sarın. 500dp'yi LinearLayout'ta tutun ve FrameLayout öğesinin WRAP_CONTENT öğesinin düzen yüksekliğine sahip olmasını sağlayın (yine de yoksayılır). Ayrıntılı yanıt için

+1

+1. Bunun hakkında ne düşüneceğimi bilmiyorum; hata - veya özellik? İşler beklendiği gibi çalışmadığında soyutlama veya zihinsel model bozulur. –

+0

Başar, teşekkürler! – kiruwka