Переключить флажок программно
У меня есть ListView элементов, которые необходимо проверить/непроверять. Я настроил ArrayAdapter, который в настоящее время использует android.R.layout.simple_list_item_multiple_choice в качестве строки, и все отображается просто отлично. Я также могу правильно получить клики по этому элементу. Однако флажок в пользовательском интерфейсе не переключается при выборе элемента. Я пытался понять это на какое-то время, может ли кто-нибудь указать мне в правильном направлении? Я просто хочу знать, как заставить пользовательский интерфейс обновляться, чтобы отразить измененное состояние флажка.
Я могу предоставить код, если это необходимо, но я пытаюсь найти что-то очень конкретное здесь, поэтому я считаю, что публикация куча моего кода не будет очень полезной.
Спасибо!
Ответы
Ответ 1
Прежде всего, пройдите мой ответ: Android listview с флажками?
Если вы хотите установить флажки с проверенными/непроверенными в ListView, вам просто нужно реализовать ниже строки в методе getView():
// also check this lines in the above example
ViewHolder holder = (ViewHolder) view.getTag();
holder.checkbox.setChecked(list.get(position).isSelected());
Также проверьте метод getView() для реализации события в CheckBox, находящемся внутри ListView:
@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());
// ......
}
Ответ 2
Программно в Java-коде
CheckBox mCheckBox = (CheckBox) findViewById(R.id.checkBox);
mCheckBox.setChecked(true); //to check
mCheckBox.setChecked(false); //to uncheck
В андроиде 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" />
Ответ 3
Вы пробовали следующее?
@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;
}
Ответ 4
Вы можете использовать пользовательский базовый адаптер. Это позволит вам выбрать только одно в момент времени, но вы можете изменить это, отменив проверку, чтобы увидеть, какие из них выбраны.
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;
}
}