গ্রিডভিউ উচ্চতা কাটা হয়


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
এই সমাধানটি মেমোরি দক্ষ নয় এবং কোষগুলি চিত্র থাকলে অ্যাপ্লিকেশনটি ক্রাশ হবে sh এই সমাধানটি সম্পূর্ণ গ্রিডভিউয়ের উচ্চতা কী তাই এটি নীচে যেতে পারে তা স্ক্রোলভিউকে বলে, তবে সমস্যাটি হ'ল এটি করার জন্য এটি পুনর্ব্যবহারযোগ্য ব্যবহার না করে সমস্ত কিছু রেন্ডার করে। 200 মিটারের বেশি কোনও আকরিক কাজ করতে পারে না।
মারিয়ানো লেটারে

7
@ অ্যাডাম্প আমি মনে করি এটির জন্য দরকারী কেস রয়েছে। আপনার যদি 2d অ্যারেতে প্রদর্শিত সীমিত সংখ্যক আইটেম থাকে তবে এই জাতীয় গ্রিডভিউ ব্যবহার করে কোনও ধরণের কাস্টম / গতিশীল টেবিললআউট তৈরি করার চেষ্টা করার চেয়ে সহজ মনে হয়, না?
greg7gkb

5
আমার জন্য কাজ করে না, আমি স্ক্রোলভিউয়ের অধীনে এক্সপেনডেবলহাইটগ্রিডভিউ রেখেছি, এটি শেষ দর্শনটি কেটে দেয়।
চিরাগ নগরিয়া

3
@ টাকোন ফ্রেমওয়ার্ক, সমর্থন লাইব্রেরি এবং ওয়েব জুড়ে অন্যান্য ওপেন সোর্স কোডে সহজেই উপলভ্য এই জাতীয় সমস্যার জন্য বেশ কয়েকটি আরও ভাল সমাধান রয়েছে, যার মধ্যে সবচেয়ে সহজ কোনও অ্যাডাপ্টারের কাছ থেকে বা অন্য কোথাও থেকে একটি লুপ টানানোর দৃশ্য হতে পারে এবং এগুলি গ্রিডলআউটে যোগ করা, (গ্রিডভিউ নয়; গ্রিডলাউটও সাপোর্ট লাইবে পাওয়া যায়) টেবিললআউট বা অনুরূপ।
16

11
@ অ্যাডাম্প যদি এটি ভাল না হয় তবে আপনার উত্তরটি সর্বোত্তম সমাধানের সাথে যুক্ত করুন যা আপনি ভাবতে পারেন
আলেব

34

@ ট্যাকোন থেকে উত্তরটি ব্যবহার করার পরে এবং এটি কার্যকর হয়েছে তা নিশ্চিত করার পরে, আমি কোডটি ছোট করার চেষ্টা করার সিদ্ধান্ত নিয়েছি। এটি আমার ফলাফল। পিএস: ট্যাকোনসের উত্তরটিতে বুলিয়ানটি "প্রসারিত" রাখার সমতুল্য সত্য হিসাবে সেট করা থাকে set

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

আমার জন্য অনুরূপ অন্য পদ্ধতির কাজটি হ'ল এক সারিটির জন্য উচ্চতা গণনা করা এবং তারপরে স্থিতিশীল ডেটা দিয়ে (আপনি এটি প্যাগিনেটে মানিয়ে নিতে পারেন) আপনি কতগুলি সারি রেখেছেন তা গণনা করতে পারেন এবং গ্রিডভিউ উচ্চতাটিকে সহজেই আকার পরিবর্তন করতে পারেন।

    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);
}

অ্যাডাপ্টার সেট করার পরে এবং গ্রিডভিউ আঁকানোর পরে আপনি এই কোডটি ব্যবহার করুন বা উচ্চতা = 0 পাবেন।

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

1
এটি আমার পক্ষে ভাল কাজ করেছে - আমি একটি তালিকাভিউয়ের অভ্যন্তরে গ্রিডভিউগুলির একটি গুচ্ছ ব্যবহার করছি। এটি এখনও খারাপ ধারণা কিনা তা নিশ্চিত নন - একটি বড় ডেটাসেট দিয়ে পারফরম্যান্স তদন্ত করতে হবে। তবে নির্বিশেষে, কোডের জন্য ধন্যবাদ। আমি মনে করি যদিও একের পর এক ত্রুটি আছে - আমাকে ব্যবহার করতে হয়েছিলint rows = items / columns + 1;
অ্যান্ড্রু

অ্যান্ড্রয়েড ওএস 5.0 এর নীচে আমি এই ত্রুটিটি java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParams
পেয়েছি

দেখুন গ্রুপ নালপয়েন্টারএক্সেপশন ছুড়ে ফেলেছে
লুক অ্যালিসন

4

টেকোনগুলি হেল্পফুলের উত্তর খুঁজে পেয়েছে ... সুতরাং আমি এটি সি # তে প্রবেশ করিয়েছি (জ্যামারিন)

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 এর জন্য উচ্চতা গণনা করুন এবং পরিমাপে সেট করুন। এখানে গ্রিডভিউ স্ক্রোলটি তেমন কাজ করবে না। সুস্পষ্টভাবে উল্লম্ব স্ক্রোল ভিউ ব্যবহার করা দরকার।

 @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);
 }

এই পদ্ধতিটি কি আপনাকে গ্রিডভিউ
সুচীথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.