[Xamarin] GridView 高度使用 wrap_content

2016-07-26

為何要這樣做呢? 因為GridView 內建Scroll ,但是我希望用外層的ScrollView 來控管,但是這時候你會發現會長這樣
Screenshot_20160726-142430
就算妳的height 設定成 wrap_content 也沒有用,依然會長這樣,這時候我們需要繼承GridView 來改寫一些東西
1. 我們參考這一篇的GridView 的sample  ( http://no2don.blogspot.com/2016/07/xamarin-gridview.html )
2. 之後我們自己建一個class 繼承GridView  DonmaGridView.cs :

using System;
using Android.Content;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
 
namespace TwoColumnListView
{
    public class DonmaGridView:GridView
    {
        protected DonmaGridView(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
            
        }
 
        public DonmaGridView(Context context) : base(context)
        {
        }
 
        public DonmaGridView(Context context, IAttributeSet attrs) : base(context, attrs)
        {
        }
 
        public DonmaGridView(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr)
        {
        }
 
        public DonmaGridView(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes)
        {
        }
 
        protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
        {
            int tmpHeight;
            if (LayoutParameters.Height == LayoutParams.WrapContent)
            {
                tmpHeight = MeasureSpec.MakeMeasureSpec(int.MaxValue >> 2, MeasureSpecMode.AtMost);
 
            }
            else
            {
                tmpHeight = heightMeasureSpec;
            }
            base.OnMeasure(widthMeasureSpec, tmpHeight);
        }
    }
}

3.在View 的部分 改成 用ScollView 去包住她,並且將DonmaGridView 的height 改成  wrap_content

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
  <TwoColumnListView.DonmaGridView xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/gridview"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:numColumns="2"
      android:verticalSpacing="2dp"
      android:horizontalSpacing="2dp"
      android:scrollbarStyle="insideOverlay"
      android:verticalScrollbarPosition="right"
      android:scrollbars="vertical" />
 
</ScrollView>

這樣就正常了,之後妳要做一些特殊動作也可以在ScrollView 上面自己控管。

source : https://www.dropbox.com/s/wvmsoqirv9c50hw/TwoColumnListView_scrollview.7z?dl=0

reference :

https://developer.android.com/guide/topics/ui/layout/gridview.html

https://www.jayway.com/2012/10/04/how-to-make-the-height-of-a-gridview-wrap-its-content/


當麻許的超技八 2014 | Donma Hsu Design.