私は例を見ましたcom.example.Android.apis.view.List11 ApiDemosから。その例では、各行はビューを取りますAndroid.R.simple_list_item_multiple_choice。そのような各ビューには、TextView
とCheckBox
があります。
ここで、各ビューに2つのTextView
sと1つのCheckBox
が必要です。これはListの例に多少似ています。次のようなカスタムレイアウトファイルrow.xmlを作成してみました。
_<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
>
<CheckBox
Android:id="@+id/checkbox"
Android:layout_alignParentRight="true"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent" />
<TextView
Android:id="@+id/text_name"
Android:textSize="13px"
Android:textStyle="bold"
Android:layout_toLeftOf="@id/checkbox"
Android:layout_alignParentLeft="true"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" />
<TextView
Android:id="@+id/text_phone"
Android:textSize="9px"
Android:layout_toLeftOf="@id/checkbox"
Android:layout_below="@id/text_name"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" />
</RelativeLayout>
_
次に、Activity
のonCreate()
で、次のようにします。
_public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Query the contacts
mCursor = getContentResolver().query(Phones.CONTENT_URI, null, null, null, null);
startManagingCursor(mCursor);
ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.row,
mCursor,
new String[] { Phones.NAME, Phones.NUMBER},
new int[] { R.id.text_name, R.id.text_phone });
setListAdapter(adapter);
getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
}
_
結果の種類は私が望むもののように見えますが、リストはどのアイテムが選択されているかを知らないように見えます。また、CheckBox
をクリックする必要があります。 List11の例では、アイテムの行をクリックするだけです。
各行のカスタムビューで複数選択リストを作成するにはどうすればよいですか?どうもありがとう。
RelativeLayout
インターフェイスを実装する独自のCheckable
を作成し、CheckBox
またはCheckedTextView
(または複数の場合はリスト)への参照を作成する必要があります。選択モード)。
この投稿を見てください: http://www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/
Rahul Gargの答えは、モデルデータに応じていくつかの行をチェックしたい場合、リストを初めてロードするときに役立ちますが、その後、自分でチェック/チェック解除イベントを処理する必要があります。
ListActivity
のonListItemCLick()
をオーバーライドして、行をチェック/チェック解除できます。
_@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
ViewGroup row = (ViewGroup)v;
CheckBox check = (CheckBox) row.findViewById(R.id.checkbox);
check.toggle();
}
_
そうする場合、ListView
を_CHOICE_MODE_MULTIPLE
_に設定しないでください。関数を呼び出すときに奇妙なことが起こります。
チェックされた行のリストを取得するには、自分でメソッドを実装する必要があり、ListView
でgetCheckItemIds()
を呼び出しても機能しません。
_ListView l = getListView();
int count = l.getCount();
for(int i=0; i<count; ++i) {
ViewGroup row = (ViewGroup)l.getChildAt(i);
CheckBox check = (Checked) row.findViewById(R.id.ck1);
if( check.isChecked() ) {
// do something
}
}
_
解決策は、クリック可能なインターフェイスを実装するカスタムビューを作成することです。
public class OneLineCheckableListItem extends LinearLayout implements Checkable {
public OneLineCheckableListItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
private boolean checked;
@Override
public boolean isChecked() {
return checked;
}
@Override
public void setChecked(boolean checked) {
this.checked = checked;
ImageView iv = (ImageView) findViewById(R.id.SelectImageView);
iv.setImageResource(checked ? R.drawable.button_up : R.drawable.button_down);
}
@Override
public void toggle() {
this.checked = !this.checked;
}
}
そして、新しいウィジェットを使用してリストアイテムのカスタムレイアウトを作成します。
<?xml version="1.0" encoding="utf-8"?>
<ax.wordster.OneLineCheckableListItem xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginBottom="4dp"
Android:background="@drawable/selector_listitem"
Android:orientation="horizontal" >
<ImageView
Android:id="@+id/SelectImageView"
Android:layout_width="60dp"
Android:layout_height="60dp"
Android:src="@drawable/button_friends_down" />
<TextView
Android:id="@+id/ItemTextView"
Android:layout_width="fill_parent"
Android:layout_height="60dp"
Android:gravity="center"
Android:text="@string/___"
Android:textAppearance="?android:attr/textAppearanceLarge"
Android:textColor="@color/text_item" />
</ax.wordster.OneLineCheckableListItem>
次に、上記のレイアウトを使用して新しいカスタムアダプターを作成します。
そのような各ビューには、TextViewとCheckBoxがあります。
いいえ、そうではありません。 CheckedTextView
があります。
各行のカスタムビューで複数選択リストを作成するにはどうすればよいですか?
CheckBox
Android:id
値は"@Android:id/text1"
そして、それが役立つかどうかを確認します。これは、Android for CheckedTextView
for simple_list_item_multiple_choice
。
この小さなコードはとても便利だと思いました: http://alvinalexander.com/Java/jwarehouse/apps-for-Android/RingsExtended/src/com/example/Android/rings_extended/CheckableRelativeLayout.Java.shtml =
@ ferdy182の http://www.marvinlabs.com/2010/10/29/custom-listview-ability-check-items/ contentへの素晴らしい追加です。
カスタムレイアウトをカスタムチェックボックスとして機能させる簡単な例:
private class FriendsAdapter extends ArrayAdapter<WordsterUser> {
private Context context;
public FriendsAdapter(Context context) {
super(context, R.layout.listitem_oneline);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rv = inflater.inflate(R.layout.listitem_oneline, parent, false);
rv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean checked = friendsListView.isItemChecked(pos);
friendsListView.setItemChecked(pos, !checked);
}
});
WordsterUser u = getItem(position);
TextView itw = (TextView) rv.findViewById(R.id.ItemTextView);
itw.setText(u.userName + " (" + u.loginName + ")");
ImageView iv = (ImageView) rv.findViewById(R.id.SelectButton);
if (friendsListView.isItemChecked(position)) {
iv.setImageResource(R.drawable.downbutton);
} else {
iv.setImageResource(R.drawable.upbutton);
}
return rv;
}
}
なんらかのトリックで可能です
メソッドのListActivtyClassで
protected void onListItemClick(ListView l, View v, int position, long id) {
//just set
<your_model>.setSelected(true);
}
今あなたにカスタムアダプタ
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(textViewResourceId, parent, false);
}
if (<your_model>.isSelected()) {
convertView.setBackgroundColor(Color.BLUE);
} else {
convertView.setBackgroundColor(Color.BLACK);
}
return convertView;
}
これにより、リストでアイテムが選択されたときにアダプターのビューをカスタマイズできます。
解決策が得られました... getView()で変換されたビューを返すときに、アダプター自体の各ビューにリスナーを追加することにより、ビューのクリック(行のカスタムレイアウトのチェックボックスなど)を取得できます。リスト固有の情報を取得する場合は、リストオブジェクトの参照を渡す必要があります。行IDのような。
プリタムの答えが正しいことを確認したい。各リストのアイテムにonClickListener
が必要です(アダプターのgetView()
で定義します)。
アイテムごとに新しいonClickListener()
を作成するか、アダプターにonClickListener()
を実装させることができます。この場合、リスナーはどのアイテムを操作しているかを知るためにアイテムにタグを付ける必要があります。
リストに依存しているonItemClickListener()
-別のスレッドでアドバイスされているように-CheckBox
がクリックイベントをインターセプトするため、リストは取得できません。
そして最後に@RahulとJVitella:
状況は、リストアイテムのCheckBox
が、リストアイテム自体とは独立してクリックおよびチェック可能でなければならないということです。したがって、解決策は、上記で説明したとおりです。