2013年4月10日水曜日

グリッドデザイン/テーブルビュー(GridView,BaseAdapter)


スマホでよく見かける表示方法のグリッド表示についてです。
使い方はリストビューとだいたい同じ感じで使えます。

■グリットビューの生成
GridView  oGridView = new GridView(Context);

■グリットビューの列数を指定
oGridView.setNumColumns(int);

横に何個並べるかの指定です。
-1にすると画面サイズに最適な列数が選ばれるようです。
ソースに-1と直書きしたくないので、
用意されている定数で記述したいのですが、用意されている定数を私はしりません。

■Adapterを設定
oGridView.setAdapter(ListAdapter);

アダプターに1セルあたりの情報を持ちます。

■サンプルソース
package com.example.sumple01;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    private List oGridList = new ArrayList();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //基礎画面の作成
        LinearLayout oLyout = new LinearLayout(getApplicationContext());
        //グリットビューの生成
        GridView  oGridView = new GridView(getApplicationContext());

        //基礎画面を画面に設定
        setContentView(oLyout);
        //基礎画面にグリットビューを追加
        oLyout.addView(oGridView);

        //グリットビューのセル?の作成
        for (int i = 0; i < 10; i ++){
            //配列にタイトルと画像を格納
            oGridList.add(new GridClass(String.valueOf("番号:" + i), R.drawable.ic_launcher));
        }

        //列数を設定(-1にするとAUTO_FIT)
        oGridView.setNumColumns(3);
        //グリットビューに各セルの情報を設定
        oGridView.setAdapter(new ListAdapter());

    }

    private class ListAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            //グリッド総数
            return oGridList.size();
        }

        @Override
        public Object getItem(int position) {
            //配列の中身
            return oGridList.get(position);
        }

        @Override
        public long getItemId(int position) {
            //現在の配列の場所
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView title;
            ImageView imag;
            View v = convertView;

            if(v==null){
                //レイアウト用の定数
                final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;

                //グリットビューの1マス内のレイアウトを作成
                LinearLayout oGridLyout = new LinearLayout(getApplicationContext());
                oGridLyout.setGravity(Gravity.CENTER_HORIZONTAL);
                //上から下にアイテムを追加
                oGridLyout.setOrientation(LinearLayout.VERTICAL);
                //イメージビューを生成
                ImageView oGridImage = new ImageView(getApplicationContext());
                //テキストビューを生成
                TextView oGridText = new TextView(getApplicationContext());
                //判別用にタグをつける
                oGridImage.setTag("CellImage");
                oGridText.setTag("CellTitle");

                //グリットビュー用のレイアウトに追加
                oGridLyout.addView(oGridImage, new LinearLayout.LayoutParams(WC, WC));
                oGridLyout.addView(oGridText, new LinearLayout.LayoutParams(WC, WC));
                v = oGridLyout;
            }

            //配列から、アイテムを取得
            GridClass oGrid = (GridClass)getItem(position);

            if( oGridList != null){
                //タグからテキストビューを取得
                title = (TextView) v.findViewWithTag("CellTitle");
                //取得したテキストビューに文字列を設定
                title.setText(oGrid.Get_Title());

                //タグからイメージビューを取得
                imag = (ImageView) v.findViewWithTag("CellImage");
                //イメージビューに画像を設定
                imag.setBackgroundResource(oGrid.Get_Image());
            }

            return v;

        }
    }

}
■クラスファイル
package com.example.sumple01;

public class GridClass{
    private String Title;
    private int imgRid;
 
    public GridClass(String title, int resId){
        Title = title;
        imgRid = resId;
    }
 
    public String Get_Title(){
        return Title;
    }
 
    public int Get_Image(){
        return imgRid;
    }
}
■実行結果



それっぽい感じになりました。

ソースを見ると、
最初に定義しているこの部分が地味に大切で
private List<GridClass> oGridList = new ArrayList<GridClass>();

リスト型のグリッドクラスを作成しています。
グリッドクラスって、何??

public class GridClass{
■クラスファイル
で作成したクラスです。


グリッド表示時に1つのセルに必要な情報を格納するクラスです。

このクラスを下記のように書き換えて


public class GridClass{
    public String Title;
    public int imgRid;
    public GridClass(String title, int resId){
        Title = title;
        imgRid = resId;
    }
}


ListAdapterクラスの文字列と画像を設定する記述を
下記のように変更するとGridClassの用途がわかりやすくなると思います。
構造体のような使い方をしているだけです。
-------------------------------------------
//取得したテキストビューに文字列を設定
title.setText(oGrid.Title);
imag.setBackgroundResource(oGrid.imgRid);
-------------------------------------------

//グリットビューのセル?の作成
for (int i = 0; i < 10; i ++){
   //グリッドクラスを生成して、配列にタイトルと画像を格納
   oGridList.add(new GridClass(String.valueOf("番号:" + i), R.drawable.ic_launcher));
}

この処理で先ほど作成した、リストにグリッドクラスの情報を格納していきます。

//グリットビューに各セルの情報を設定
oGridView.setAdapter(new ListAdapter());


こちらの処理で、グリッドビューにアダプタの情報(BaseAdapterをextendsしているクラス)を渡しています。

BaseAdapterをextendsしているクラスについてですが、、

getCount()の数だけ、処理は行われます。

if (v==~
の中で1セルのレイアウトを作成して、

if(oGrid~
の中で、その作成したレイアウトに必要な情報を
oGridListから取得して、レイアウトに設定しています。

BaseAdapterをextendsするクラスは
結構よく使うので、使い方を覚えておきましょう。


0 件のコメント:

コメントを投稿