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