ListActivity

Posted by muchag | Android |
初回投稿:2011-04-15 (金) 17:51:19 | 最終更新:2011-07-07 (木) 19:52:20

ListActivityActivity クラスのサブクラスである。

その名の通り、ListView を配置したいアクティビティに利用する。

Android Developers:ListActivity

概要

ListActivity クラスは、ListView 表示用のため
ListView を利用する際に様々な特典がある。
 

レイアウト XML
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android">
  4.  
  5.     <ListView android:id="@+id/android:list" />
  6.     <TextView android:id="@+id/android:empty"
  7.             android:text="@string/nodata" />
  8. </RelativeLayout>

ListActivity で ListView を利用するには
5,6行目のように、ListView と TextView をセットで配置し
ID を上記のように設定することで
データがあるときは ListView を、データがないときは TextView を
自動的に配置してくれる。
 

ListView の取得

普段スクリプトにてビューを取得する場合は

  1. ListView listview = (ListView) findViewById(R.id.list);

のように記述するが、ListActivity では

  1. ListView listview = getListView();

とするだけでよい。

もっとも ID を前述のように記述しているので
ID から取得するのは不可能だが。
 

イベント

ListActivity には、デフォルトで onListItemClick メソッドが用意されているので
インターフェイスを実装しなくても、そのまま利用できる。

  1. public class ListActivityTest extends ListActivity {
  2.  
  3.     /* 省略 */
  4.  
  5.     @Override
  6.     protected void onListItemClick(ListView listView, View view, int position, long id) {
  7.         super.onListItemClick(listView, view, position, id);
  8.  
  9.         /* 処理 */
  10.     }
  11. }

Android Developers:ListActivity onListItemClick

しかし残念ながら onListItemLongClick や onListItemSelected というメソッドは存在しないようだ。

もしこれらを利用したいのであれば、いつも通り
実装してリスナーの登録をしてやればよい。

  1. public class ListActivityTest extends ListActivity implements AdapterView.OnItemLongClickListener {
  2.  
  3.      @Override
  4.     public void onCreate(Bundle savedInstanceState) {
  5.             super.onCreate(savedInstanceState);
  6.  
  7.         ListView listview = getListView();
  8.         listview.setOnItemLongClickListener(this);
  9.     }
  10.  
  11.     @Override
  12.     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
  13.  
  14.         /* 処理 */
  15.     }
  16. }

ちなみに、OnItemClickListener を登録すると onListItemClick メソッドは無視される
 

ListView のカスタマイズ

mucchinのAndroid戦記:ListViewのカスタマイズ方法
こちらを参考に、というか丸ごとパクらせていただいて実現。
 

データの取得&設定
Sample.java
  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3.  
  4.     super.onCreate(savedInstanceState);
  5.  
  6.     List<ItemBean> myProfile = new ArrayList<ItemBean>();
  7.  
  8.     /* DB 部分省略 cursor に取得済みとする */
  9.     if (cursor.getCount() != 0) {
  10.  
  11.         boolean isEof = cursor.moveToFirst();
  12.         while (isEof) {
  13.  
  14.             ItemBean ibProfile = new ItemBean();
  15.             ibProfile.setId( cursor.getInt( cursor.getColumnIndex("_id") ) );
  16.             ibProfile.setName( cursor.getString( cursor.getColumnIndex("name") ) );
  17.             ibProfile.setBirth( cursor.getString( cursor.getColumnIndex("birth") ) );
  18.             myProfile.add(ibProfile);
  19.  
  20.             isEof = cursor.moveToNext();
  21.         }
  22.  
  23.         ListAdapter adapter = new ListAdapter(getApplicationContext(), myProfile);
  24.         setListAdapter(adapter);
  25.  
  26.         ListView list = getListView(); // ListActivity なので、これでレイアウト上の ListView を取得できる
  27.         list.setOnItemClickListener(this); //リスト項目をタップしたときのリスナー
  28.     }
  29. }

 

ListAdapter クラス
Sample.java
  1. class ListAdapter extends ArrayAdapter<ItemBean>
  2. {
  3.     private LayoutInflater mInflater;
  4.     private TextView txtName;
  5.     private TextView txtBirth;
  6.  
  7.     public ListAdapter(Context context, List<ItemBean> objects) {
  8.  
  9.         super(context, 0, objects);
  10.         mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  11.     }
  12.  
  13.     public View getView(final int position, View convertView, ViewGroup parent) {
  14.  
  15.         if (convertView == null) {
  16.  
  17.             convertView = mInflater.inflate(R.layout.list_profile, null);
  18.         }
  19.  
  20.         final ItemBean item = this.getItem(position);
  21.  
  22.         if(item != null){
  23.  
  24.             txtName = (TextView)convertView.findViewById(R.id.txtName);
  25.             txtName.setText(item.getName());
  26.  
  27.             txtBirth = (TextView)convertView.findViewById(R.id.txtBirth);
  28.             txtBirth.setText(item.getBirth());
  29.         }
  30.  
  31.         return convertView;
  32.     }
  33. }

 

イベント処理
Sample.java
  1. @Override
  2. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  3.  
  4.     ListView listView = (ListView) parent;
  5.     ListAdapter adapter = (ListAdapter) listView.getAdapter();
  6.  
  7.     final ItemBean item = adapter.getItem(position);
  8.     int id = item.getId();
  9.     String name = item.getName();
  10.     String birth = item.getBirth();
  11. }

 

ItemBean クラス

これが一番嬉しかった!

Java には連想配列というものがないそうで
連想配列に慣れてきた私には
このクラスはとっても理解しやすかった。

ItemBean.java
  1. public class ItemBean {
  2.  
  3.     private int intId = 0;
  4.     private String strName = "";
  5.     private String strBirth = "";
  6.  
  7.     public void setId(int intId) {
  8.         this.intId = intId;
  9.     }
  10.     public int getId() {
  11.         return intId;
  12.     }
  13.  
  14.     public void setName(String strName) {
  15.         this.strName = strName;
  16.     }
  17.     public String getName() {
  18.         return strName;
  19.     }
  20.  
  21.     public void setBirth(String strBirth) {
  22.         this.strBirth = strBirth;
  23.     }
  24.     public String getBirth() {
  25.         return strBirth;
  26.     }
  27. }

 

XML

ListView の各行用の XML ファイル。

list_profile.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout
  3.     xmlns:android="http://schemas.android.com/apk/res/android"
  4.     >
  5.    
  6.     <TextView
  7.         android:id="@+id/txtName"
  8.     />
  9.    
  10.     <TextView
  11.         android:id="@+id/txtBirth"
  12.         android:layout_toRightOf="@+id/txtName"
  13.     />
  14.  
  15. </RelativeLayout>

 
ひとまず無事に取得できたけど
これから少しずつ研究。

Posted by muchag | Android |
初回投稿:2011-04-15 (金) 17:51:19 | 最終更新:2011-07-07 (木) 19:52:20

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment