スマホでよく見かける表示方法のグリッド表示についてです。
使い方はリストビューとだいたい同じ感じで使えます。
■グリットビューの生成
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 件のコメント:
コメントを投稿