onClick がリスト内のすべてのチェックボックスをチェックする selectall チェックボックスを実装しようとしています。
アクティビティ onCreate で、このレイアウトを読み込みます。selectallチェックボックスが常に一番上にある場所。
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="fill_parent"
android:layout_height="50dp" >
<CheckBox
android:id="@+id/cb_selectall"
android:text="@string/s_ab_selectall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</CheckBox>
</LinearLayout>
<ListView
android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:cacheColorHint="#0000"
android:clipToPadding="true"
android:dividerHeight="1dp"
android:scrollbars="none"
android:soundEffectsEnabled="true" >
</ListView>
これは、setOnCheckedChangeListener を使用して selectall を実装しようとしている私のアダプターです。
public class MyMediaAdapter extends ArrayAdapter<Media> {
private final List<Media> list;
private final Activity context;
public MyMediaAdapter(Activity context, List<Media> list) {
super(context, R.layout.media_view, list);
this.context = context;
this.list = list;
}
private class ViewHolder {
protected TextView fName, fSub, fDuration, fSize;
protected CheckBox checkbox;
// protected CheckBox checkbox1;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
// Moved here to ensure the checkbox is persistent
ViewHolder viewHolder = new ViewHolder();
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.media_view, null);
// Moved out of the if-else to solve the problem
// view being recycled each time it scrolls
// final ViewHolder viewHolder = new ViewHolder();
viewHolder.fName = (TextView) view.findViewById(R.id.tvfname);
viewHolder.fSub = (TextView) view.findViewById(R.id.tvsub);
viewHolder.fDuration = (TextView) view.findViewById(R.id.tvduration);
viewHolder.fSize = (TextView) view.findViewById(R.id.tvsize);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
// viewHolder.checkbox.setId(position);
viewHolder.checkbox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v;
int id = cb.getId();
if (selection[id]) {
cb.setChecked(false);
selection[id] = false;
list.get(id).setSelected(false);
} else {
cb.setChecked(true);
selection[id] = true;
list.get(id).setSelected(true);
}
}
});
view.setTag(viewHolder);
// Moved out of the if-else to solve the problem
// view being recycled each time it scrolls
// viewHolder.checkbox.setTag(list.get(position));
} else {
view = convertView;
// Moved out of the if-else to solve the problem
// view being recycled each time it scrolls
// ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
viewHolder = (ViewHolder) view.getTag();
}
final CheckBox checkbox1 = (CheckBox) findViewById(R.id.cb_selectall);
checkbox1.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton button, boolean checked) {
// TODO Auto-generated method stub
if (checked) {
checkbox1.setText("Click to Deselect All");
for (int i = 0; i < getMediaList.size(); i++) {
selection[i] = true;
list.get(i).setSelected(true);
}
} else {
checkbox1.setText("Click to Select All");
for (int i = 0; i < getMediaList.size(); i++) {
selection[i] = false;
list.get(i).setSelected(false);
}
}
Toast.makeText(getApplicationContext(), "this " +checked, Toast.LENGTH_LONG).show();
}
});
// Moved here to ensure the checkbox is persistent
viewHolder.checkbox.setId(position);
viewHolder.checkbox.setTag(list.get(position));
ViewHolder holder = (ViewHolder) view.getTag();
holder.fName.setText(list.get(position).getName());
holder.fSub.setText(list.get(position).getPath());
// Converting duration from String to Long
long milli = Long.valueOf(list.get(position).getDuration());
// Put it in % min, % sec format to display
holder.fDuration.setText(util.readableTime(milli));
// Convert data size from String to Long
long datasize = Long.valueOf(list.get(position).getData());
// Put in human readable format
holder.fSize.setText(util.readableFileSize(datasize));
holder.checkbox.setChecked(list.get(position).isSelected());
return view;
}
}
問題は、selectall チェックボックスをオンにすると、リストの項目を取得できるということです。ビュー自体では、個々のチェックボックスは下にスクロールしたときにのみ表示されます。selectall チェックボックスをオンにしても、すぐにはチェックされません。
更新: notifyDataSetChanged(); を呼び出すだけで問題を解決しました。checkchangelistener の後。