Android
ListView

ボタン付きのListViewを実装してみる

はじめに

ListViewで各行にボタンを実装したいことってありますよね。今回はそれを作ってみます。
今回は削除ボタンを実装してみます。

実装方法

まずは各行のレイアウトを作成します。

list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants">

        <TextView
        android:id="@+id/ListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"/>

        <ImageButton
        android:id="@+id/DeleteButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:layout_alignParentRight="true"
        android:padding="16dp"
        android:background="#00000000"
        android:src="@drawable/ic_delete_black_24px"/>

</RelativeLayout>

android:descendantFocusability="blocksDescendants"を忘れると、アイテムのリスナーが無効になってしまいます。削除ボタンのリスナーは無効になりませんけど。

ListViewの各行のアイテムのデータを格納するクラスを作ります。ただ、xmlからも分かるように今回はTextViewは1つしかないので格納するデータは1つだけですが、実装する際には必要に応じて増やすといいでしょう。

Item.java
public class Item {

    private String data;

    //データを格納
    public void setData(String data){
        this.data=data;
    }

    //データを返す
    public String getData(){
        return this.data;
    }
}

次はListViewのアダプタです。

MyListAdapter.java
public class MyListAdapter extends ArrayAdapter<Item> {

    private LayoutInflater inflater;
    Item item;

    public MyListAdapter(Context context, int resource, List<Item> objects) {
        super(context, resource, objects);

        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    //実質的な処理はここに
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            //ListViewの各行のレイアウトを設定
            convertView = inflater.inflate(R.layout.list_item, null);
        }

        //リストのアイテムデータの取得
        item = this.getItem(position);

        //削除ボタンの設定
        ImageButton DeleteButton=(ImageButton)convertView.findViewById(R.id.DeleteButton);
        DeleteButton.setOnClickListener(new DeleteListener());

        TextView textView = (TextView) convertView.findViewById(R.id.ListItem);
        if (textView != null) {
            //アイテムデータに設定されたテキストを表示
            textView.setText(item.getData());
        }

        return convertView;
    }

    //削除ボタンのリスナー
    class DeleteListener implements View.OnClickListener {
        public void onClick(View v){
           //削除処理

            //Snackbarで通知
            Snackbar.make(v, "削除しました", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    }
}

あとはActivityに記述を追加すればOKです。

MainActivity.java
~省略~
    ListView listview=(ListView)findViewById(R.id.listview);//ActivityのListViewのID
    List<Item> data=new ArrayList<Item>();
    MyListAdapter lad=new MyListAdapter(this,0,data);
    listview.setAdapter(lad);

    String str="hogehoge";
    Item item=new Item();
    item.setData(str);
    data.add(item);
~省略~

これで実装できました。

参考

http://android-note.open-memo.net/sub/list_view__make_custom_list.html
http://blogs.gine2.jp/taka/archives/2966
http://aftercider.hatenablog.com/entry/2012/12/27/150116