2012年05月09日

選択不可のリスト項目を指定する


BaseAdapterクラスのisEnabledメソッドを使用して
選択不可のリスト項目を指定する事ができます
前回のリスト項目のレイアウトを自由にカスタマイズ(2)を参照し
選択不可の項目を作ります
前回作成したListMemberAdapterの中に以下のものを追記します
    	public boolean isEnabled(int position) {
    	    if (position == 0)
    	        return false;
    	    else
    	        return true;
    	}
すると1番目のリスト項目(position = 0)が選択できなくなります
これは(position+1)番目の項目を選択不可にするものです

一応javaプログラム全体をのせます
package blog.test;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
	//独自クラスMemberを作成
    private class Member {
        private String name,team;
        private int number;
 
        public Member(String name, int number , String team) {
            this.name = name;
            this.number = number;
            this.team = team;
            
        }
 
        public String getName() {
            return name;
        }
 
        public int getNumber() {
            return number;
        }
        public String getTeam() {
            return team;
        }
    }
 
    //BaseAdapterを拡張した独自Adapterの定義
    private class ListMemberAdapter extends BaseAdapter {
        private Context context;
        private List list;
 
        public ListMemberAdapter(Context context) {
            super();
            this.context = context;
            //ListにMemberを追加する
            //追加にはMemberクラスを使用
            list = new ArrayList();
            list.add(new Member("Ichiro", 51,"Mariners"));
            list.add(new Member("Matsui", 55,"Rays"));
            list.add(new Member("Darvish", 11,"Rangers"));
        }
 
        //選択不可の項目を作成
    	public boolean isEnabled(int position) {
    	    if (position == 0)
    	        return false;
    	    else
    	        return true;
    	}
        
        public int getCount() {
            return list.size();
        }
 
        public Object getItem(int position) {
 
            return list.get(position);
        }
 
        public long getItemId(int position) {
            return position;
        }
 
        public View getView(int position, View convertView, ViewGroup parent) {
        	Member member = (Member) getItem(position);
 
            
            TextView tvName,tvNumber,tvTeam;
            View v = convertView;

            if(v==null){
              LayoutInflater inflater = 
                (LayoutInflater)
                  getSystemService(Context.LAYOUT_INFLATER_SERVICE);
              v = inflater.inflate(R.layout.list, null);
            }

            if(member != null){
              tvName = (TextView) v.findViewById(R.id.textView1);
              tvNumber = (TextView) v.findViewById(R.id.textView2);
              tvTeam = (TextView) v.findViewById(R.id.textView3);
              
              tvName.setText("Name : "+member.getName());
              tvNumber.setText("Number : "+String.valueOf(member.getNumber()));
              tvTeam.setText("Team : "+member.getTeam());
            }
            return v;
        }
    }
    


	
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        ListView lv = new ListView(this);
        setContentView(lv);
 
        lv.setAdapter(new ListMemberAdapter(this));
    }
}

スポンサードリンク

リスト項目のレイアウトを自由にカスタマイズ


今までのリストビューは1行につき1つの項目を表示させるものでした
今回は1行分のレイアウトをカスタマイズして3つのテキストを表示させてみたいと思います

BaseAdapterクラスを拡張
BaseAdapterクラスを拡張することでオリジナルのAdapterクラスを定義し
getCount・getItem・getItemId・getViewを実装します
その中のgetViewメソッドを変更しリスト項目のレイアウトを自由にカスタマイズする事ができます
具体的にやってみます
今回はリストビュー1行につき3つの項目
日本人メジャーリーガーの名前、背番号、チーム名を表示させました
package blog.test;
 
import java.util.ArrayList;
import java.util.List;
 
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
 
public class MainActivity extends Activity {
 
	//独自クラスMemberを作成
    private class Member {
        private String name,team;
        private int number;
 
        public Member(String name, int number , String team) {
            this.name = name;
            this.number = number;
            this.team = team;
            
        }
 
        public String getName() {
            return name;
        }
 
        public int getNumber() {
            return number;
        }
        public String getTeam() {
            return team;
        }
    }
 
    //BaseAdapterを拡張した独自Adapterの定義
    private class ListMemberAdapter extends BaseAdapter {
        private Context context;
        private List list;
 
        public ListMemberAdapter(Context context) {
            super();
            this.context = context;
            //ListにMemberを追加する
            //追加にはMemberクラスを使用
            list = new ArrayList();
            list.add(new Member("Ichiro", 51,"Mariners"));
            list.add(new Member("Matsui", 55,"Rays"));
            list.add(new Member("Darvish", 11,"Rangers"));
        }
 
        public int getCount() {
            return list.size();
        }
 
        public Object getItem(int position) {
 
            return list.get(position);
        }
 
        public long getItemId(int position) {
            return position;
        }
 
        public View getView(int position, View convertView, ViewGroup parent) {
        	Member member = (Member) getItem(position);
 
            LinearLayout layout = new LinearLayout(context);
            layout.setOrientation(LinearLayout.VERTICAL);
            convertView = layout;
            //Nameを入力
            TextView tvName = new TextView(context);
            tvName.setText("Name : "+member.getName());
            layout.addView(tvName);
          //Numberを入力
            TextView tvNumber = new TextView(context);
            tvNumber.setText("Number : "+String.valueOf(member.getNumber()));
            layout.addView(tvNumber);
          //Teamを入力
            TextView tvTeam = new TextView(context);
            tvTeam.setText("Team : "+member.getTeam());
            layout.addView(tvTeam);
 
            return convertView;
        }
    }
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        ListView lv = new ListView(this);
        setContentView(lv);
 
        lv.setAdapter(new ListMemberAdapter(this));
    }
}

ListMemberAdapterクラスでgetViewを変更しています
getViewの戻り値となるViewオブジェクトは、リスト項目を表示するViewオブジェクトとなります
つまり、このgetViewメソッドで、TextViewオブジェクトを3つ作成して
変数positionが示す列位置にある、MemberのName/Number/Teamの値を表示するように指定して
これが1行分となります

このプログラムの結果は以下のようになります
device102.png
リストビュー1行に3項目表示されています
スポンサードリンク

2012年05月07日

ListViewの簡単なカスタマイズ(アイコンの追加)


ArrayAdapterの第2引数で指定しているレイアウトファイルには
独自に作成したレイアウトファイルを指定する事ができました
レイアウトファイルを独自設定する
今回はそれの簡単なカスタマイズとしてアイコンの追加を行いたいとおもいます
まずは前回とすこし変えてmain.xmlの編集から行います
main.xmlにはリニアレイアウトとリストビューのみ配置します
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>
    
</LinearLayout>
次にListView の行毎の表示方法を変えるためには
独自に作成したレイアウトファイルを用意します
res/layout/list.xmlを新規作成します
また同時に追加するアイコンを設定したいと思います
アイコンは以下の画像を使用しました
101.png
アイコンはresフォルダに新規にdrawableフォルダを作り
その中にpngファイルとして保存します
device100.png
保存方法はdrawableフォルダを作ったらコピー&ペーストでOKです

次に1行分のレイアウト、list.xmlです
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
>
<TextView 
  android:id="@+id/list_textview1"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  android:layout_weight="1"
  android:textSize="20sp"
  android:padding="10dip"
/>
<ImageView
  android:src="@drawable/icon"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_vertical"
/>

</LinearLayout>
horizontalのLiniarLayoutにTextViewとImageViewを配置しています
ImageViewにより先ほど配置したdrawable/iconを指定しています

最後にMainActivity.javaを以下のように編集します
package blog.test;
  
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
  
public class MainActivity extends Activity {
 
    private String[] mStrings ={ "test1", "test2", "test3", "test4" };
    ListView listView1;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //リストビューを作成
        setContentView(R.layout.main);
        listView1 = (ListView)findViewById(R.id.listView1);
 
        ArrayAdapter adapter = new ArrayAdapter(this,
                R.layout.list,R.id.list_textview1, mStrings);
        listView1.setAdapter(adapter);
  
        //クリックイベントを検出
        listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView parent, View view,
                    int position, long id) {
                //listViewを指定
                ListView listView = (ListView) parent;
                //クリックされたものを取得
                String item = (String) listView.getItemAtPosition(position);
                //Log出力
                Log.v("tag", String.format("onItemClick: %s", item));
            }
        });
         
        //セレクトされたときに実行される
        listView1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView parent, View view,
                    int position, long id) {
                //listViewを指定
                ListView listView = (ListView) parent;
                //クリックされたものを取得
                String item = (String) listView.getSelectedItem();
                Log.v("tag", String.format("onItemSelected: %s", item));
            }
            //何も選択さてないときに実行
            public void onNothingSelected(AdapterView parent) {
                Log.v("tag", "onNothingSelected");
            }
        });
    }
}
ArrayAdapter adapterの部分での第二引数に行毎のレイアウト
第三引数には文字列をセットするためのTextView ウィジェットの ID を指定しています
(この場合はR.layout.listとR.id.list_textview1)
これによりmStringをlist_textview1に入れることができます

実行結果は以下のようになります
device99.png
iconが追加されているのがわかります
スポンサードリンク

2012年04月26日

onItemClickの引数


前回、リストビューのイベント取得において
setOnItemClickListenersetOnItemSelectedListeneを使用しました

ListViewのクリック
指定したリストビューのitemを取得するのにonItemClickが使用されています
今回はこのonItemClickをもう少し詳しく見ていきたいと思います

onItemClick(AdapterView parent, View view,int position, long id)
parent:クリックされたAdapterのビューとなる
view:実際にクリックされたビュー
position:アダプターの何番目がクリックされたか
id:クリックされた列のid

前回のプログラムを以下のように変更して何が取得されているのかを詳しく見たいと思います
MainActivity.java
package blog.test;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
public class MainActivity extends Activity {

    private String[] mStrings ={ "test1", "test2", "test3", "test4" };
    
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //リストビューを作成 
        ListView lv = new ListView(this);
        setContentView(lv);

        ArrayAdapter adapter = new ArrayAdapter(this,
                android.R.layout.simple_list_item_1, mStrings);
        lv.setAdapter(adapter);
 
        //クリックイベントを検出
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView parent, View view,
                    int position, long id) {
            	//listViewを指定
                //ListView listView = (ListView) parent;
                //クリックされたものを取得
                String get_parent = (String) parent.getClass().getSimpleName();
                String get_position = String.valueOf(position);
                String get_id = String.valueOf(id);
                //Log出力
                Log.v("tag", String.format("onItemClick: %s", get_parent));
                Log.v("tag", String.format("onItemClick: %s", get_position));
                Log.v("tag", String.format("onItemClick: %s", get_id));
            }
        });
        
        //セレクトされたときに実行される
        lv.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView parent, View view,
                    int position, long id) {
            	//listViewを指定
                //ListView listView = (ListView) parent;
                //クリックされたものを取得
                String get_parent = (String) parent.getClass().getSimpleName();
                String get_position = String.valueOf(position);
                String get_id = String.valueOf(id);
                //Log出力
                Log.v("tag", String.format("onItemClick: %s", get_parent));
                Log.v("tag", String.format("onItemClick: %s", get_position));
                Log.v("tag", String.format("onItemClick: %s", get_id));
            }
            //何も選択さてないときに実行
            public void onNothingSelected(AdapterView parent) {
                Log.v("tag", "onNothingSelected");
            }
        });
    }
}

ためしにtest1をクリックしてみると・・・
device97.png
parentはListViewが、positionは0が(1番目-1)、idも0が(1番目-1)が
それぞれLogとして出力されます

同様に下ボタンでtest1をセレクトすると
device95.png

device98.png
こちらも同様にparentはListViewが、positionは0が(1番目-1)、idも0が(1番目-1)が
Logとして出力されます

スポンサードリンク