15

की कुल ऊंचाई को मापने के लिए मुझे ListView की कुल ऊंचाई मापने की आवश्यकता है, लेकिन ऐसा लगता है कि मुझे लगातार गलत मान मिल रहे हैं। मैं इस कोड का उपयोग कर रहा हूं:एंड्रॉइड: ListView

public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     return; 
    } 

    int totalHeight = 0; 
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), 
      MeasureSpec.AT_MOST); 
    Log.w("DESIRED WIDTH", String.valueOf(listAdapter.getCount())); 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += listItem.getMeasuredHeight(); 
     Log.w("HEIGHT"+i, String.valueOf(totalHeight)); 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 

समस्या यह है कि मुझे प्राप्त होने से बड़ी ऊंचाई प्राप्त हो रही है। प्रत्येक सूची वस्तु को अलग-अलग मापा जाता है और सभी वस्तुओं की ऊंचाई समान होती है, इसलिए यह निश्चित रूप से ऐसा नहीं करना चाहिए। प्रत्येक तत्व की ऊंचाई कम से कम इसकी वास्तविक ऊंचाई से दोगुना है।

अग्रिम धन्यवाद।

edit1:

मैं दो listviews है और वे दोनों 6-7 EditText क्षेत्रों के साथ आइटम नहीं हैं। यदि मैं EditText में मान लिखना/हटाना चाहता हूं तो मैं ListView को दिखा/छुपाता हूं। सबकुछ अच्छी तरह से काम करता है जब मैं सूची दिखाना चाहता हूं, इसमें बहुत सारी जगह होती है क्योंकि विधि गणना सूची दृश्य को बहुत अधिक जगह की आवश्यकता होती है। इसके कारण मेरे पास सूची दृश्य के नीचे बहुत खाली जगह है। आवश्यक तीन गुना अधिक खाली जगह की तरह।

+1

http://stackoverflow.com/questions/2312683/calculate-the-size-of-a-list-view-or-: यह काम कर कोड है जो ListView ऊंचाई का है और पूर्ण आकार में ListView सेट है – RobinHood

+0

कैसे-से-बताएं-पूरी तरह से विस्तार करें, धन्यवाद, लेकिन यह मेरे लिए काम नहीं करता है। मुझे लगता है कि मुझे यह समस्या है क्योंकि मेरे पास सिर्फ एक सूची दृश्य नहीं है। अंतरिक्ष कवरेज के साथ शायद कुछ संघर्ष है। – Cristiano

उत्तर

42

अंत में मैंने इसे किया है!

public static void getTotalHeightofListView(ListView listView) { 

    ListAdapter mAdapter = listView.getAdapter(); 

    int totalHeight = 0; 

    for (int i = 0; i < mAdapter.getCount(); i++) { 
     View mView = mAdapter.getView(i, null, listView); 

     mView.measure(
       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 

       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

     totalHeight += mView.getMeasuredHeight(); 
     Log.w("HEIGHT" + i, String.valueOf(totalHeight)); 

    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (mAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

} 
+7

आपको इस विधि का नाम बदलना चाहिए। इसे "प्राप्त" के साथ शुरू करने से शून्य के अलावा एक वापसी मूल्य का तात्पर्य है। –

+0

इसके अतिरिक्त, यह विधि निष्पादित करने में बहुत धीमी है, मैं केवल तभी चलाने की अनुशंसा करता हूं जब सूची आइटमों की संख्या बदल जाती है। –

+4

आपको 'listView.getPaddingTop() 'और नीचे जोड़ने की भी आवश्यकता है। – njzk2

0

ListView दृश्य आइटम को कैश करता है और उनका पुन: उपयोग करता है। यदि आपके पास 1000 आइटमों के साथ एक सूची दृश्य है और केवल 6 दृश्यमान हैं, तो क्यों नहीं, यह 994 दिखाए जाने के लायक नहीं है।

पूरे सूची दृश्य को मापने का मतलब प्रत्येक सूची Iteem प्रस्तुत करना होगा, थोड़ा अधिक लगता है।

मैं नहीं जानता कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन वहाँ शायद एक बेहतर तरीका :)

+0

मेरे पास इतनी सारी चीज़ें नहीं हैं :) मेरे पास दो सूची दृश्य हैं और दोनों में 6-7 संपादन टेक्स्ट फ़ील्ड हैं। यदि मैं EditText में मान लिखना/हटाना चाहता हूं तो मैं ListView को दिखा/छुपाता हूं। सबकुछ अच्छी तरह से काम करता है जब मैं सूची दिखाना चाहता हूं, इसमें बहुत सारी जगह होती है क्योंकि विधि गणना सूची दृश्य को बहुत अधिक जगह की आवश्यकता होती है। इसके कारण मेरे पास सूची दृश्य के नीचे बहुत खाली जगह है। आवश्यक तीन गुना अधिक खाली जगह की तरह। – Cristiano

+0

लेकिन ListView नहीं जानता कि आप इसका उपयोग कैसे करेंगे, इसलिए यह इस तरह लिखा गया है। यदि आप सूची सूची में से किसी एक को गायब होने और स्क्रीन पर स्थान भरने के लिए स्क्रीन पर स्थान छोड़ना चाहते हैं, तो View.setVisibility (View.GONE) –

+0

का उपयोग करें, मैं 'View.setVisibility (View.GONE)' का उपयोग कर रहा हूं लेकिन जब मैं इसे फिर से दिखाता हूं यह वास्तव में बहुत सी जगह, खाली जगह की पूरी स्क्रीन लेता है। मैं एक लिंक देख रहा हूं जो @RobinHood पोस्ट किया गया। ऐसा लगता है कि वे इसे अलग-अलग मापकर ऐसा करने में कामयाब रहे। – Cristiano

2

कुछ इस तरह का प्रयास है:

listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listItemHeight = listItem.getHeight(); 
    } 
}); 

आप ListView की ऊंचाई चाहते हैं तो इस कोशिश :

listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listViewHeight = listView.getHeight(); 
    } 
}); 

आप भी इस जांच कर सकता है: Calculate the size of a list view or how to tell it to fully expand

+0

धन्यवाद लेकिन यह मेरे लिए काम नहीं करता है। मैंने पहली पोस्ट में एक संपादन किया। मुझे लगता है कि समस्या कई सूचियों के साथ है। – Cristiano

+0

यदि किसी के पास एक ही ऊंचाई वाली वस्तुओं वाली एक सूची है, तो मुझे लगता है कि सूची कर रहे हैं। LayoutParams = new LinearLayout.LayoutParams (fill_parent, thisFixedHeight * Count) जाने का तरीका है। कहीं भी पुनरावृत्ति नहीं। वास्तविक समस्या सूची की सूचियों की सूची के साथ कुछ काम करना है। –