GridView詳解

  • GridView基本使用方法
  • GridView的屬性和方法詳解

GridView基本使用方法

  GridView是一個在二維可滾動的網格中展示內容的控件。網格中的內容通過使用adapter自動插入到佈局中。
  下面通過實現一個簡單的顯示省份名的demo,介紹GridView控件的基本使用方法:

在佈局中使用GridView控件,實現activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.sunxiaodong.androidgridview.MainActivity">

    <GridView
        android:id="@+id/grid_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:columnWidth="90dp"
        android:gravity="center"
        android:horizontalSpacing="10dp"
        android:numColumns="auto_fit"
        android:stretchMode="columnWidth"
        android:verticalSpacing="10dp" />

</RelativeLayout>

  這個GridView會填充滿整個屏幕,關於使用屬性的說明,在下一節“GridView主要屬性詳解”中將進行說明。

MainActivity.java中,獲取GridView控件,並進行初始化設置

public class MainActivity extends AppCompatActivity {

    private GridView mGridView;
    private ProvinceAdapter mProvinceAdapter;
    private String[] provinceNames = new String[]{"北京", "上海", "廣東", "廣西", "天津", "重慶", "湖北", "湖南", "河北", "河南", "山東"};
    private int[] bgColor = new int[]{R.color.color_00ff00, R.color.color_ff0000, R.color.color_ff0000, R.color.color_ffff00,
            R.color.color_8e35ef, R.color.color_303F9F, R.color.color_00ff00, R.color.color_ff0000, R.color.color_ff0000,
            R.color.color_ffff00, R.color.color_8e35ef};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        mGridView = (GridView) this.findViewById(R.id.grid_view);
        List<ProvinceBean> provinceBeanList = new ArrayList<>();
        for (int i = 0; i < provinceNames.length; i++) {
            ProvinceBean provinceBean = new ProvinceBean();
            provinceBean.setName(provinceNames[i]);
            provinceBean.setColor(bgColor[i]);
            provinceBeanList.add(provinceBean);
        }
        mProvinceAdapter = new ProvinceAdapter(this, provinceBeanList);
        mGridView.setAdapter(mProvinceAdapter);
    }

}

  程序中,首先使用findViewById方法獲取到了GridView控件,接下來使用setAdapter方法給它設置提供數據的適配器。程序中,引入了兩份數據provinceNames 和bgColor,其中provinceNames定義了依次顯示在GridView各網格中的省份名稱,bgColor定義了依次顯示在GridView網格中的省份名稱的背景色,這些只是爲了更方便讀者從視覺上認識GridView。

創建ProvinceAdapter.java文件,實現數據在GridView中的展示

public class ProvinceAdapter extends BaseAdapter {

    private List<ProvinceBean> provinceBeanList;
    private LayoutInflater layoutInflater;

    public ProvinceAdapter(Context context, List<ProvinceBean> provinceBeanList) {
        this.provinceBeanList = provinceBeanList;
        layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return provinceBeanList.size();
    }

    @Override
    public Object getItem(int position) {
        return provinceBeanList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = layoutInflater.inflate(R.layout.province_grid_view_item_layout, null);
            holder = new ViewHolder();
            holder.text = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        ProvinceBean provinceBean = provinceBeanList.get(position);
        if (provinceBean != null) {
            holder.text.setText(provinceBean.getName());
            holder.text.setBackgroundResource(provinceBean.getColor());
        }
        return convertView;
    }

    class ViewHolder {
        TextView text;
    }

}

  ProvinceAdapter繼承自BaseAdapter,有幾個必須實現的方法getCount()getItem(int position)getItemId(int position)getView(int position, View convertView, ViewGroup parent)。其中,getCount()返回需要展示的GridView的項數。getItem(int position)返回給定位置的數據對象。getItemId(int position)返回該項的行id。getView(int position, View convertView, ViewGroup parent)是必須要實現的方法,該方法控制GridView中數據項的顯示,方法中的convertView視圖是被複用的視圖,在實現時對其進行判斷,如果爲null,則新建視圖,否則直接複用視圖。

  上面程序的執行效果如下圖所示:
這裏寫圖片描述

GridView的屬性和方法詳解

GridView的主要屬性

  • android:columnWidth
    相關方法setColumnWidth(int)。定義每一列的固定寬度。
    必須是dimension值(浮點數後面拼接單位,例如“14.5sp”)。有效的單位有:px,dp,sp,in,mm。
    它也可以是一個資源的引用(@[package:]type:name)或主題屬性(?[package:][type:]name)。
  • android:gravity
    相關方法setGravity(int)。定義每一個單元格的重心。
    必須是一個或多個(使用“|”分隔)下面的常量
常量 描述
top 0x30 將對象放在它的容器的頂部,不會改變它的大小
bottom 0x50 將對象放在它的容器的底部,不會改變它的大小
left 0x03 將對象放在它的容器的左面,不會改變它的大小
right 0x05 將對象放在它的容器的右面,不會改變它的大小
center_vertical 0x10 將對象放在它的容器垂直方向的中心,不會改變它的大小
fill_vertical 0x70 如果需要改變對象的垂直大小以完全填充它的容器
center_horizontal 0x01 將對象放在它的容器水平方向的中心,不會改變它的大小
fill_horizontal 0x07 如果需要改變對象的水平大小以完全填充它的容器
center 0x11 將對象放在它的容器的中心,不會改變它的大小
fill 0x77 如果需要改變對象的水平和垂直方向的大小以完全填充它的容器
clip_vertical 0x80 附加選項被設置用來將子視圖的上面或下面邊緣裁剪到它的容器的邊界。這個裁剪基於垂直方向的重心:top重心將會裁剪底部邊緣,bottom重心將會裁剪頂部邊緣,不會同時裁剪兩邊
clip_horizontal 0x08 附加選項被設置用來將子視圖的左面或右面邊緣裁剪到它的容器的邊界。這個裁剪基於水平方向的重心:left重心將會裁剪右面邊緣,right重心將會裁剪左面邊緣,不會同時裁剪兩邊
start 0x00800003 將對象放在它的容器的起始位置,不會改變它的大小
end 0x00800005 將對象放在它的容器的末尾位置,不會改變它的大小
  • android:horizontalSpacing
    相關方法setHorizontalSpacing(int)。定義了兩列之間的水平間隔。
    屬性設置要求同android:columnWidth
  • android:numColumns
    相關方法setNumColumns(int)。定義了展示的列數。
    可以是一個整形值,如“100”。也可以是一個資源的引用(@[package:]type:name)或主題屬性(?[package:][type:]name)。或者下面的這個常量:
常量 描述
auto_fit -1 在有效空間展示儘量多的列數
  • android:stretchMode
    相關方法setStretchMode(int)。定義了列拓展填充有限閒置空間的方式。
    必須是下面常量值中的一個:
常量 描述
none 0 擴展無效
spacingWidth 1 列與列之間的空間被擴展
columnWidth 2 每一列被相等的拓展
spacingWidthUniform 3 列與列之間的空間被均勻的擴展
  • android:verticalSpacing
    相關方法setVerticalSpacing(int)。定義兩行之間的垂直間隔。
    屬性設置要求同android:columnWidth

GridView的主要方法

Public方法
  • ListAdapter:getAdapter()
    返回關聯的Adapter
  • int:getColumnWidth()
    返回列的寬度
  • int:getGravity()
    返回描述子視圖被放置的方式的標識。默認爲Gravity.LEFT
  • int:getHorizontalSpacing()
    返回列間的水平間隔大小。
    僅會計算當前佈局。如果調用了setHorizontalSpacing(int)來設置間隔,但佈局還沒有完成,這個方法會返回一箇舊值。如果想要明確地獲取這個間隔,使用getRequestedHorizontalSpacing()方法請求。
  • int:getNumColumns()
    返回列數。如果網格沒有被佈局,則返回AUTO_FIT
  • int:getRequestedColumnWidth()
    返回請求的列寬度。
    這可能不是真實的列寬度。使用getColumnWidth()獲取當前真實的列寬度。
  • int:getRequestedHorizontalSpacing()
    返回請求的列間的水平間隔。
    這個值可能是佈局期間的局部樣式,也可能是默認的樣式,或是使用setHorizontalSpacing(int)方法設置的值。如果佈局尚未完成或GridView計算得到了一個和請求的不同的水平間隔,它與getHorizontalSpacing()將有不同的返回值。
  • int:getStretchMode()
    返回擴展模式。
  • int:getVerticalSpacing()
    返回行間的垂直間隔。
  • onInitializeAccessibilityNodeInfoForItem(View view, int position, AccessibilityNodeInfo info)
    使用列表中實際項的信息初始化一個AccessibilityNodeInfo
參數 描述
View 呈現列表項的視圖
position 在Adapter中列表項的位置
info 需要初始化的信息項(Node Info)
  • boolean:onKeyDown(int keyCode, KeyEvent event)
    KeyEvent.Callback.onKeyDown()的默認實現:如果視圖可點擊,當KEYCODE_DPAD_CENTERKEYCODE_ENTER被釋放時,執行視圖按下事件。
    軟鍵盤上的按鍵事件通常不會觸發這個監聽,儘管有些條件下可能會觸發,但不要依賴它去捕獲關鍵盤按鍵事件。
    返回值:處理返回true,否則返回false。
  • boolean:onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
    KeyEvent.Callback.onKeyMultiple()的默認實現:一直返回false。
    軟鍵盤上的按鍵事件通常不會觸發這個監聽,儘管有些條件下可能會觸發,但不要依賴它去捕獲關鍵盤按鍵事件。
    返回值:處理返回true,否則返回false。
  • boolean:onKeyUp(int keyCode, KeyEvent event)
    KeyEvent.Callback.onKeyUp()的默認實現:當KEYCODE_DPAD_CENTERKEYCODE_ENTER被釋放時,執行視圖點擊事件。
    軟鍵盤上的按鍵事件通常不會觸發這個監聽,儘管有些條件下可能會觸發,但不要依賴它去捕獲關鍵盤按鍵事件。
    返回值:處理返回true,否則返回false。
  • setAdapter(ListAdapter adapter)
    爲GridView設置數據。
  • setColumnWidth(int columnWidth)
    設置寬度。
  • setGravity(int gravity)
    設置網格的中重心。重心描述了子視圖的擺放方式。默認是Gravity.LEFT
  • setHorizontalSpacing(int horizontalSpacing)
    設置列間的水平間隔。
  • setNumColumns(int numColumns)
    設置列數。
  • setRemoteViewsAdapter(Intent intent)
    設置該AbsListView使用遠程視圖適配器,該適配器通過特定的Intent連接到一個RemoteViewsService。
  • setSelection(int position)
    設置當前選中項。
  • setStretchMode(int stretchMode)
    設置列表項如何拓展填充閒置空間的方式。
    可以設置下面常量值中的一個:
常量 描述
NO_STRETCH 0 擴展無效
STRETCH_COLUMN_WIDTH 2 擴展列
STRETCH_SPACING 1 擴展列間的空間
STRETCH_SPACING_UNIFORM 3 均勻地擴展列間的空間
  • setVerticalSpacing(int verticalSpacing)
    設置行間的垂直間隔。
  • smoothScrollByOffset(int offset)
    平滑地滾動到具體的適配器位置的偏移位置。視圖會滾動到指定位置顯示出來。
  • smoothScrollToPosition(int position)
    平滑地滾動到具體的適配器位置。視圖會滾動到指定位置顯示出來。
Protected方法
  • attachLayoutAnimationParameters(View child, ViewGroup.LayoutParams params, int index, int count)
    子視圖可以覆寫該方法來在提供的child上設置佈局動畫參數。
參數 描述
child 和動畫參數關聯的子視圖
params 持有動畫參數的子視圖的佈局參數
index 子視圖在視圖組中的索引
count 視圖組中子視圖的數量
  • computeVerticalScrollExtent()
    計算滾動條把手在縱向滾動範圍內佔用的幅度。該值用於計算滾動條把手在滾動條滑道中的長度。
    範圍使用與computeVerticalScrollRange()computeVerticalScrollOffset()相同的任意單位。
    默認的長度是視圖的可繪製高度。
    返回值:滾動條把手在縱向滾動範圍內佔用的幅度。
  • computeVerticalScrollOffset()
    計算滾動條把手在縱向滾動範圍內的位置。該值用於計算滾動條把手在滾動條滑道中的位置。
    範圍使用與computeVerticalScrollRange()computeVerticalScrollExtent()相同的任意單位。
    默認位置是視圖的滾動條位置。
    返回值:滾動條把手的縱向位置
  • computeVerticalScrollRange()
    計算垂直滾動條的垂直範圍。
    範圍使用與computeVerticalScrollExtent()computeVerticalScrollOffset()相同的任意單位。
    返回值:縱向滾動條代表的整個縱向範圍。默認縱向範圍時視圖的繪製高度。
  • layoutChildren()
    子類必須實現該方法,來佈局子視圖
  • onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)
    當視圖焦點狀態改變時,視圖系統調用該方法。由定向導航導致的焦點變更時,direction和previouslyFocusedRect提供了焦點是從那裏來的進一步信息。
參數 描述
gainFocus 如果視圖具有焦點,值爲真;否則爲假
direction 當調用requestFocus()爲該視圖設置焦點時,該值爲焦點移動的方向。其值爲FOCUS_UP、FOCUS_DOWN、FOCUS_LEFT或者FOCUS_RIGHT
previouslyFocusedRect 失去焦點的視圖的矩形座標,使用該視圖的座標系統.如果指定了,它將傳入可以知道焦點來自哪裏的詳細信息(作爲對direction 的補充)。否則,其值爲null
  • onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    對視圖及其內容進行測量,來決定佈局的寬和高。

源碼地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章