足立様ありがとうございます。教えていただいたサイトを参考にしたところ、getViewの中で呼び出すViewをCheckableインターフェース
を用いたViewを用意すれば
リスト押下時にチェックボックスにチェックが入り、setChoiceModeも機能するようになりました。ありがとうございました。
参考になればと思い、以下に作成したサンプルコードを貼っておきます。
package com.ListTest;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class ListTestActivity extends Activity {
private static final String[] GENRES = new String[] { "Action",
"Adventure", "Animation", "Children", "Comedy", "Documentary",
"Drama", "Foreign", "History", "Independent", "Romance", "Sci-Fi",
"Television", "Thriller" };
private ListView listview;
private Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listview = (ListView) findViewById(R.id.list);
button = (Button) findViewById(R.id.button1);
CAdapter adapter=new CAdapter(this,GENRES);
listview.setAdapter(adapter);
listview.setItemsCanFocus(false);
listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
SparseBooleanArray checked = listview.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
if (checked.valueAt(i) == true) {
Log.i(getClass().getSimpleName(),
"" + GENRES[checked.keyAt(i)] + "");
}
}
}
});
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ArrayList<String> tempArray=new ArrayList<String>();
SparseBooleanArray checked = listview.getCheckedItemPositions();
for (int i = 0; i < checked.size(); i++) {
if (checked.valueAt(i) == true) {
tempArray.add(GENRES[checked.keyAt(i)]);
}
}
for(String s:tempArray){
Toast.makeText(getApplicationContext(), s, 0).show();
}
}
});
}
class ViewHolder {
TextView textview;
CheckBox checkbox;
}
class CAdapter extends ArrayAdapter<String> {
private ViewHolder holder;
public CAdapter(Context context, String[] objects) {
super(context, 0, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup
parent) {
if (convertView == null) {
convertView = new cCheckBox(getContext());
holder = new ViewHolder();
holder.textview = (TextView)
convertView.findViewById(R.id.textView1);
holder.checkbox = (CheckBox)
convertView.findViewById(R.id.checkBox1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textview.setText(getItem(position).toString());
ListView listview = (ListView) parent;
holder.checkbox.setChecked(listview.isItemChecked(position));
return convertView;
}
}
}
package com.ListTest;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.Checkable;
import android.widget.CheckedTextView;
import android.widget.LinearLayout;
import android.widget.ListView;
public class cCheckBox extends LinearLayout implements Checkable {
private CheckBox checkbox;
public cCheckBox(Context context) {
super(context);
View
view=((LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.row,
this,false);
checkbox=(CheckBox)view.findViewById(R.id.checkBox1);
addView(view);
}
@Override
public void setChecked(boolean checked) {
checkbox.setChecked(checked);
}
@Override
public boolean isChecked() {
return checkbox.isChecked();
}
@Override
public void toggle() {
setChecked(!isChecked());
}
}