Edited at

ボタン付きの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