2014-09-12 4 views
7

को अनदेखा करता है, मैं इस दृश्य को फुलाता हूं, और इसे हेडर के रूप में अपनी सूची दृश्य में जोड़ता हूं। मैं (इस उदाहरण के लिए, कठिन कोडित) यह उच्च 500dp बनाने के लिएListView शीर्षलेख 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 अपने हेडर के authoritah सम्मान नहीं करता है कोशिश कर रहा हूँ और उसकी सामग्री पर घूमती है। क्या कोई बता सकता है कि क्या होता है?

उत्तर

12

क्या हो रहा है यह समझने की कुंजी यह पता लगाना है कि ListView शीर्षलेख और पाद लेख कैसे कार्यान्वित किए जाते हैं। वे एक चाल हैं: जिस पल में आप अपनी सूची दृश्य में पहला हेडर या पाद लेख जोड़ते हैं, तो आपका ListAdapter HeaderViewListAdapter में लपेटा जाता है (line 270 of ListView.java पर होता है)। हेडर लिस्ट व्यूएडाप्टर एक सूची एडाप्टर है जो हेडर और पाद लेखों को शामिल करने के लिए count और position मानों को बदलता है; शीर्षलेख और पाद लेख सामान्य सूची आइटम बन जाते हैं जो सिस्टम आपके लिए प्रबंधित करता है।

आप line 207 of HeaderListViewAdapter.java को देखें, तो आप getView कार्यान्वयन पर ध्यान नहीं देता कि parent दृश्य है जब एक शीर्ष लेख या पाद लेख जोड़ने देखेंगे। इसका प्रभाव यह है कि इसका mLayoutParams एक्सएमएल से प्रारंभ नहीं होता है (वास्तव में आपको स्रोत कोड पर इंगित नहीं कर सकता है, केवल कुछ समय के साथ मुझे पता चला है)।

आप एक बिट के लिए getView के लिए कॉल, पिछले line 2237 of AbsListView.javaLayoutParams के लिए खोज (जो मैं अभी क्या किया) आप line 1182 of ListView.java पर अंत का पालन करें, और थोड़ा obtainView के लिए कॉल का पालन करें और। यहाँ आप देखते हैं कि, अगर लेआउट पैरामीटर null हैं जब बच्चे को देखने मापा जाता है, यह generateDefaultLayoutParams() के लिए बाहर कॉल, line 6065 of AbsListView.java पर कार्यान्वित किया जाता है जो:

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

... और कहा कि जहाँ आपके WRAP_CONTENT से आ रही है है ।

एक आसान काम के आसपास के रूप में, बस <FrameLayout/> के अंदर अपने एक्सएमएल के <LinearLayout/> को लपेटें। 500 डीपी को LinearLayout पर रखें और फ्रेमलेआउट में WRAP_CONTENT की लेआउट ऊंचाई बनाएं (जिसे वैसे भी अनदेखा कर दिया जाएगा)। विस्तृत उत्तर के लिए

+1

+1। मुझे यकीन नहीं है कि इसके बारे में क्या सोचना है; बग - या सुविधा? जब चीजें अपेक्षित काम नहीं करतीं तो अमूर्तता, या मानसिक मॉडल टूट जाता है। –

+0

भयानक, धन्यवाद! – kiruwka