戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
08

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カスタマイズしたListViewに設定したCheckBoxのon/offを行全体で行う

今回はカスタマイズした ListViewCheckBox を乗せたときの on/off 切替を行選択時に行う方法の紹介。

ListView(の項目)にCheckBoxを乗せた場合、CheckBoxのon/off切替はCheckBoxをクリックした時だけになります。
しかもCheckBoxが項目のフォーカスを奪ってしまっているため、onItemClickイベントが発生しなくなっています

そこで、CheckBoxが項目から奪っているフォーカスを項目にお返しし、onItemClickイベントでCheckBoxの on/off を切り替えるようにします。
これはレイアウトの <CheckBox> に以下の2つの属性を追加することで対応できます。

android:clickable="false"
 CheckBoxにフォーカスを当たらなくし、onItemClickイベントを発生するようにします。
android:focusable="false"
 CheckBoxのクリック時にチェックの on/off 切り替えを無効にします。

※android:clickable="false"だけ追加してandroid:focusable="false"を忘れるとCheckBoxが項目からフォーカスを奪ったままクリックできない(イベントを起こせない)状態になります

以下、サンプルソース。
アダプタとデータは前回の記事『ListViewに編集可能なViewを追加する』のを使用しています。

----------------------------------------------------------------------
リストの項目のレイアウト
res/layout/sample_row_check.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="5dp"
android:layout_weight="1"
android:textSize="24sp" />
<CheckBox
android:id="@+id/checkBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:clickable="false"
android:focusable="false" />
</LinearLayout>

----------------------------------------------------------------------
アクティビティクラス
CustomCheckListActivity.java
package jp.inujirushi.sample.activity.custom;

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

import jp.inujirushi.sample.R;
import jp.inujirushi.sample.adapter.CustomCheckAdapter;
import jp.inujirushi.sample.adapter.CustomCheckData;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.Toast;

public class CustomCheckListActivity extends Activity implements
OnItemClickListener {
/** アダプタ */
private CustomCheckAdapter mAdapter;

/**
* アクティビティが生成されたときに呼ばれます
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample_listview);

// リストビューに表示する項目を生成する
List list = new ArrayList();
for (int i = 0; i < 20; i++) {
list.add(new CustomCheckData("項目" + i, true));
}

// リストビューを取得する
ListView listView = (ListView) findViewById(R.id.listView);

// リストビューにカスタムしたリストアダプタを設定する
mAdapter = new CustomCheckAdapter(this, list);
listView.setAdapter(mAdapter);

// リストビューに項目クリックイベントを設定する
listView.setOnItemClickListener(this);
}

/**
* 項目をクリックしたときに呼ばれます
*/
@Override
public void onItemClick(AdapterView parent, View view, int position,
long id) {
// 項目のチェックボックスを取得する
CheckBox chk = (CheckBox) view.findViewById(R.id.checkBox);

// チェックボックスを反転する(アダプタの onCheckedChanged() が呼ばれる)
chk.setChecked(!chk.isChecked());

// 項目情報を取得する
CustomCheckData data = mAdapter.getItem(position);

// 取得した情報をトースト表示する
Toast.makeText(this, position + ":" + data.isChecked,
Toast.LENGTH_SHORT).show();
}
}
スポンサーサイト

Comments

承認待ちコメント
このコメントは管理者の承認待ちです

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。