2013年9月30日月曜日

リストビューの基礎(ListView, BaseAdapter)


これもまた、よくあるUIの
リストビューの作り方を説明します。

基本的な作り方はGridViewと同じで、

ListViewオブジェクトの生成
adapterの生成
adapterにアイテムを入れる
ListViewにadapterをsetな流れです。


サンプルソースでは
アイコン(画像)と共に文字をクラスに格納させ、画面に表示させています。

行の中にレイアウトを作成しているので、
固定的なリストビューでなく、カスタマイズ可能なリストビューになっています。

package com.example.pururun;

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

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemClickListener{

    private List dataList = new ArrayList();
 
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        //基礎のレイアウトを作成
        LinearLayout oLayout = new LinearLayout(getApplicationContext());
        //今回の主役リストビューの生成
        ListView oListView   = new ListView(getApplicationContext());
        //リストビューに入れるアイテムのAdapterを生成
        ListAdapter     oAdp = new ListAdapter(getApplicationContext());

        //リストビューのレイアウトを指定
        oListView.setLayoutParams(new LinearLayout.LayoutParams(MP, MP));
        //リストビューにアイテムadapterを設定
        oListView.setAdapter(oAdp);
        //リストビューをクリックした時の処理を設定
        oListView.setOnItemClickListener(this);

        for (int i = 0; i < 10; i ++){
            //配列にタイトルと画像を格納
            dataList.add(new ListItem(String.valueOf("番号:" + i), R.drawable.ic_launcher));
        }
        
        //Adapteの中身を更新
        oAdp.notifyDataSetChanged();

        //基礎のレイアウトにリストビューを追加
        oLayout.addView(oListView);
        //基礎のレイアウトを画面に設定
        setContentView(oLayout);
    }
 
    public class ListAdapter extends BaseAdapter{

        private Context mContext;
  
        public ListAdapter(Context context){
            //生成時のコンストラクターでコンテクストを取得
            mContext = context;
        }
  
        @Override
        public int getCount() {
            //リストの行数
            return dataList.size();
        }

        @Override
        public Object getItem(int posion) {
            //配列の中身を返す
            return dataList.get(posion);
        }

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

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            TextView title;
            ImageView imag;
            View v = view;
            if(v==null){
                //グリットビューの1マス内のレイアウトを作成
                LinearLayout oListLayout = new LinearLayout(mContext);
                //左から右にアイテムを追加
                oListLayout.setOrientation(LinearLayout.HORIZONTAL);
                //イメージビューを生成
                ImageView oImage = new ImageView(mContext);
                //テキストビューを生成
                TextView oText = new TextView(mContext);
                //判別用にタグをつける
                oImage.setTag("CellImage");
                oText.setTag("CellTitle");
                //グリットビュー用のレイアウトに追加
                oListLayout.addView(oImage);
                oListLayout.addView(oText);
                v = oListLayout;
            }
            //配列から、アイテムを取得
            ListItem oList = (ListItem)getItem(position);
            if( dataList != null){
            //タグからテキストビューを取得
            title = (TextView) v.findViewWithTag("CellTitle");
            //取得したテキストビューに文字列を設定
            title.setText(oList.Get_Text());
            //タグからイメージビューを取得
            imag = (ImageView) v.findViewWithTag("CellImage");
            //イメージビューに画像を設定
            imag.setBackgroundResource( oList.Get_Res() );
        }
        return v;
    }
}

    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        //押された時のパラメーターを表示
        Toast.makeText(getApplicationContext(), "押下されたのは:" + String.valueOf(position), Toast.LENGTH_SHORT).show();
        Toast.makeText(getApplicationContext(), "IDは:" + String.valueOf(id), Toast.LENGTH_SHORT).show();
    }
}

■ListItemクラス

package com.example.pururun;

public class ListItem {

    private String sText;
    private int    iRes;

    public ListItem(String text, int res){
        //文字列を取得
        sText = text;
        //画像のResIDを取得
        iRes  = res;
    }

    public String Get_Text(){
        //文字列を返す
        return sText;
    }

    public int Get_Res(){
        //画像のResIDを返す
        return iRes;
    }
}


■実行結果


0 件のコメント:

コメントを投稿