チェック可能/チェック不可にする必要があるアイテムのListViewがあります。現在Android.R.layout.simple_list_item_multiple_choiceを行として使用しているArrayAdapterを設定しましたが、すべてが正常に表示されます。このアイテムのクリックも適切に取得できます。ただし、UIのチェックボックストグルしないアイテムが選択されたとき。私はしばらくの間これを理解しようとしてきました、誰かが私を正しい方向に向けることができますか?チェックボックスの変更された状態を反映するようにUIを強制的に更新する方法を知りたいだけです。
必要に応じてコードを提供できますが、ここでは非常に具体的なものを探しているので、たくさんのコードを投稿してもあまり役に立ちません。
ありがとう!
まず最初に私のこの答えを調べます: チェックボックス付きのAndroidリストビュー?
ListViewでチェック済み/未チェックのチェックボックスを実装したいので、getView()メソッドで以下の行を実装するだけです。
// also check this lines in the above example
ViewHolder holder = (ViewHolder) view.getTag();
holder.checkbox.setChecked(list.get(position).isSelected());
また、ListView内にあるCheckBoxでのイベントの実装についてgetView()メソッドを確認してください。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.rowbuttonlayout, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.label);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkbox
.setOnCheckedChangeListener(
new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
Model element = (Model) viewHolder.checkbox
.getTag();
element.setSelected(buttonView.isChecked());
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
} else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());
holder.checkbox.setChecked(list.get(position).isSelected());
// ......
}
プログラムでJavaコード
CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkBox);
mCheckBox.setChecked(true); //to check
mCheckBox.setChecked(false); //to uncheck
Android XML
Android:checked="true" //to check
Android:checked="false" //to uncheck
なので
<CheckBox
Android:id="@+id/checkBox"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:checked="true"
Android:text="Checkbox Item" />
次のことを試しましたか?
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
//Invert the checkbox-status
((CheckedTextView) view.findViewById(R.id.text1)).setChecked(!isChecked());
return;
}
カスタムベースアダプタを使用できます。これにより、一度に1つだけを選択できるようになりますが、チェックを解除して選択されているものを確認することで、これを変更できます。
public class CheckBoxGridAdapter extends BaseAdapter{
LayoutInflater inflater;
ArrayList<Holder> list;
int res;
Context context;
public CheckBoxGridAdapter(Context context, ArrayList<Holder> list, int layoutResourceId) {
inflater = LayoutInflater.from(context);
this.context = context;
this.list =list;
this.res = layoutResourceId;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(res,
parent, false);
holder = new ViewHolder();
holder.tv1 = (TextView) convertView.findViewById(R.id.checkBoxTxt);
holder.cb = (CheckBox) convertView.findViewById(R.id.checkBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Holder h = list.get(position);
holder.tv1.setText(h.getCBName());
holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked)
{
int pos = (Integer) buttonView.getTag();
checkChecks(pos);
}
CheckBoxGridAdapter.this.notifyDataSetChanged();
}
});
holder.cb.setTag(position);
holder.cb.setChecked(list.get(position).getSelectState());
return convertView;
}
protected void checkChecks(int pos) {
for(int i = 0;i<list.size();i++)
{
Holder h = (Holder) list.get(i);
if(i==pos)
{
Log.d( pos +" checked","is checked");
h.setSelectState(true);
}
else
{
Log.d( i +" checked","is not checked");
h.setSelectState(false);
}
}
}
static class ViewHolder
{
TextView tv1;
CheckBox cb;
RadioButton rb;
}
}