ग्रिडव्यू की ऊंचाई कट जाती है


124

मैं ग्रिडव्यू के अंदर 8 आइटम प्रदर्शित करने का प्रयास कर रहा हूं। अफसोस की बात है, ग्रिडव्यू की ऊंचाई हमेशा बहुत कम होती है, जिससे यह केवल पहली पंक्ति, और दूसरे का थोड़ा हिस्सा दिखाता है।

सेटिंग android:layout_height="300dp"यह काम करता है। लपेटो contentऔर fill_parentजाहिरा तौर पर नहीं।

मेरा ग्रिड दृश्य:

<GridView
    android:id="@+id/myId"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:horizontalSpacing="2dp"
    android:isScrollContainer="false"
    android:numColumns="4"
    android:stretchMode="columnWidth"
    android:verticalSpacing="20dp" />

मेरे आइटम संसाधन:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:minHeight="?android:attr/listPreferredItemHeight" >

    <ImageView
        android:id="@+id/appItemIcon"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:src="@android:drawable/ic_dialog_info"
        android:scaleType="center" />      

    <TextView
        android:id="@+id/appItemText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="My long application name"
        android:gravity="center_horizontal"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

समस्या ऊर्ध्वाधर स्थान की कमी से संबंधित नहीं लगती है।

मैं क्या कर सकता हूँ ?


जवाबों:


351

(बहुत अधिक) अनुसंधान के बाद, मैं नील ट्रफ्ट के उत्कृष्ट उत्तर पर ठोकर खाई ।

के लिए अपने काम को अपनाना GridViewआसान मर चुका है।

ExpandableHeightGridView.java:

package com.example;
public class ExpandableHeightGridView extends GridView
{

    boolean expanded = false;

    public ExpandableHeightGridView(Context context)
    {
        super(context);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ExpandableHeightGridView(Context context, AttributeSet attrs,
            int defStyle)
    {
        super(context, attrs, defStyle);
    }

    public boolean isExpanded()
    {
        return expanded;
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        // HACK! TAKE THAT ANDROID!
        if (isExpanded())
        {
            // Calculate entire height by providing a very large height hint.
            // View.MEASURED_SIZE_MASK represents the largest height possible.
            int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);

            ViewGroup.LayoutParams params = getLayoutParams();
            params.height = getMeasuredHeight();
        }
        else
        {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    public void setExpanded(boolean expanded)
    {
        this.expanded = expanded;
    }
}

इसे अपने लेआउट में इस तरह शामिल करें:

<com.example.ExpandableHeightGridView
    android:id="@+id/myId"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:horizontalSpacing="2dp"
    android:isScrollContainer="false"
    android:numColumns="4"
    android:stretchMode="columnWidth"
    android:verticalSpacing="20dp" />

अंत में आपको केवल इसे विस्तृत करने के लिए कहने की आवश्यकता है:

mAppsGrid = (ExpandableHeightGridView) findViewById(R.id.myId);
mAppsGrid.setExpanded(true);

20
यह समाधान मेमोरी कुशल नहीं है और यदि सेल इमेज हैं तो ऐप क्रैश हो जाएगा। यह समाधान स्क्रॉलव्यू को बताता है कि पूर्ण ग्रिडव्यू की ऊंचाई कितनी है इसलिए यह नीचे जा सकता है, लेकिन समस्या यह है कि ऐसा करने के लिए यह रीसाइक्लिंग का उपयोग किए बिना सब कुछ प्रदान करता है। 200 मीटर से अधिक कोई भी अयस्क काम नहीं कर सकता था।
मारियानो लटोरे

7
@ मुझे लगता है कि इसके लिए उपयोगी मामले हैं। यदि आपके पास 2 डी सरणी में सीमित संख्या में आइटम हैं, तो इस तरह की ग्रिड व्यू का उपयोग करना किसी प्रकार के कस्टम / डायनामिक टेबललैट बनाने की कोशिश करने की तुलना में आसान लगता है, नहीं?
greg7gkb

5
मेरे लिए काम नहीं करता है, मैंने ScrollView के तहत ExpandableHeightGridView डाल दिया है, यह अंतिम दृश्य काट देता है।
चिराग नगरिया

3
@ टैकोन वेब पर इस तरह की समस्या के लिए बेहतर समाधान उपलब्ध हैं, जो वेब में आसानी से उपलब्ध हैं, लाइब्रेरी और अन्य ओपन सोर्स कोड, जिनमें से सबसे आसान एक लूप पुलिंग व्यू के लिए एडॉप्टर या अन्य जगहों से लिया जा सकता है और उन्हें GridLayout में जोड़ना, (GridView नहीं; GridLayout सपोर्ट लिब में भी उपलब्ध है) TableLayout या समान।
आरा

11
@adamp अगर यह अच्छा नहीं है, तो कृपया अपने उत्तर को उस सर्वोत्तम समाधान के साथ जोड़ें, जिसके बारे में आप सोच सकते हैं
aleb

34

@Tacone से उत्तर का उपयोग करने और यह सुनिश्चित करने के बाद कि यह काम कर रहा है, मैंने कोड को छोटा करने का प्रयास करने का निर्णय लिया। यह मेरा परिणाम है। पुनश्च: यह बाक़ी "विस्तारित" होने के बराबर है, जो कि टैकोन्स के उत्तर में हमेशा सही होता है।

public class StaticGridView extends GridView {

    public StaticGridView(Context context) {
        super(context);
    }

    public StaticGridView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public StaticGridView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST));
        getLayoutParams().height = getMeasuredHeight();
    }
}

लेकिन प्रतीक्षा करें - यह अभी भी स्मृति उपयोग की समस्या से ग्रस्त है; तुम अब ठीक नहीं कर रहे हैं?
फेटी

6

एक और समान दृष्टिकोण जो मेरे लिए काम करता है, वह है एक पंक्ति के लिए ऊँचाई की गणना करना और फिर स्थैतिक डेटा के साथ (आप इसे पगेट के लिए अनुकूल कर सकते हैं) आप गणना कर सकते हैं कि आपके पास कितनी पंक्तियाँ हैं और आसानी से GridView ऊँचाई का आकार बदल सकते हैं।

    private void resizeGridView(GridView gridView, int items, int columns) {
    ViewGroup.LayoutParams params = gridView.getLayoutParams();
    int oneRowHeight = gridView.getHeight();
    int rows = (int) (items / columns);
    params.height = oneRowHeight * rows;
    gridView.setLayoutParams(params);
}

एडेप्टर सेट करने के बाद इस कोड का उपयोग करें और जब GridView तैयार हो जाए या आपको ऊँचाई = 0 मिल जाए।

gridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (!gridViewResized) {
                    gridViewResized = true;
                    resizeGridView(gridView, numItems, numColumns);
                }
            }
        });

1
यह मेरे लिए अच्छी तरह से काम किया - मैं एक ListView के अंदर GridViews का एक गुच्छा का उपयोग कर रहा हूँ। सुनिश्चित नहीं है कि अभी तक कोई बुरा विचार है या नहीं - बड़े डेटासेट के साथ प्रदर्शन की जांच करने की आवश्यकता है। लेकिन परवाह किए बिना, कोड के लिए धन्यवाद। मुझे लगता है कि वहाँ एक बंद-एक करके त्रुटि यह है - मैं का इस्तेमाल किया थाint rows = items / columns + 1;
एंड्रयू

Android ओएस 5.0 से नीचे के लिए मुझे यह त्रुटि java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
मिलती है

ViewGroup.LayoutParams params = gridView.getLayoutParams (); एक NullPointerException फेंकता है
ल्यूक एलिसन

4

मिला tacones उत्तर सहायक ... इसलिए मैंने इसे C # (Xamarin) में पोर्ट किया

public class ExpandableHeightGridView: GridView
{
    bool _isExpanded = false;

    public ExpandableHeightGridView(Context context) : base(context)
    {            
    }

    public ExpandableHeightGridView(Context context, IAttributeSet attrs) : base(context, attrs)
    {            
    }

    public ExpandableHeightGridView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
    {            
    }

    public bool IsExpanded
    {
        get { return _isExpanded; }

        set { _isExpanded = value;  }
    }

    protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        // HACK! TAKE THAT ANDROID!
        if (IsExpanded)
        {
            // Calculate entire height by providing a very large height hint.
            // View.MEASURED_SIZE_MASK represents the largest height possible.
            int expandSpec = MeasureSpec.MakeMeasureSpec( View.MeasuredSizeMask, MeasureSpecMode.AtMost);
            base.OnMeasure(widthMeasureSpec,expandSpec);                

            var layoutParameters = this.LayoutParameters;
            layoutParameters.Height = this.MeasuredHeight;
        }
        else
        {
            base.OnMeasure(widthMeasureSpec,heightMeasureSpec);    
        }
    }
}

1
कुदोस दोस्त। महान काम करता है xamarin.android
सुचित

0

बस AT_MOST के लिए ऊंचाई की गणना करें और माप पर सेट करें। यहां GridView स्क्रॉल काम नहीं करेगा। स्पष्ट रूप से कार्यक्षेत्र स्क्रॉल दृश्य का उपयोग करने की आवश्यकता है।

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     int heightSpec;

     if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {

         heightSpec = MeasureSpec.makeMeasureSpec(
                        Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
     }
     else {
         // Any other height should be respected as is.
         heightSpec = heightMeasureSpec;
     }

     super.onMeasure(widthMeasureSpec, heightSpec);
 }

क्या यह विधि आपको GridView के लिए स्क्रॉल करने में मदद करती है
सुचित
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.