我收到了ListActivity
我创建的列表项。每个项目都有一个CheckBox
。此外,布局有一个按钮,假设只是检查所有复选框,但即使正在调用按钮的OnClickListener
它也无法正常工作。
这是从列表适配器调用的方法:
public void ChangeAllCheckStatus(boolean checked)
{
synchronized (items)
{
for (ItemData item : items)
{
item.checked= checked;
}
}
notifyDataSetChanged();
}
这是getView
方法:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View vi = convertView;
if (vi == null)
{
vi = m_inflater.inflate(R.layout.myItem, null);
}
TextView nameTextView = (TextView) vi.findViewById(R.id.firstText);
TextView addressTextView = (TextView) vi.findViewById(R.id.secondText);
CheckBox cb = (CheckBox) vi.findViewById(R.id.the_checkBox);
nameTextView.setText(items.get(position).string1);
addressTextView.setText(items.get(position).string2);
cb.setSelected(items.get(position).checked);
return vi;
}
我是如何检查所有复选框的?
答案 0 :(得分:2)
您无法从适配器获取视图。 ListView
就是这样做的。
相反,你可以通过这样的ListView
循环它们:
ListView lv;
int itemCount = lv.getCount();
for (int i=0; i<itemCount; ++i) {
CheckBox cb = (CheckBox) lv.getChildAt(i).findViewById(R.id.the_checkBox);
cb.setChecked(true);
}
答案 1 :(得分:1)
listItem = myList.getAdapter().getView(i, null, null);
错了。您不应直接访问ListView
项。您应该封装数据集中每个项目的已检查状态,并让getView
使其工作。
假设您的boolean status;
项目中有ListView
成员,您可以在适配器中添加方法,
public void checkAll() {
synchronized(items) {
for (Item item : items) {
item.status = true;
}
}
notifyDataSetChanged();
}
编辑:
它有一个扩展BaseAdapter的适配器,它也接收2 字符串数组作为值。它创建特定的视图 只需设置2个带有相应值的文本框即可定位 来自这两个阵列。
您可以使用一个封装所需信息的小类,而不是拥有两个数组。 E.g
public class Item {
public String mFirstString;
public String mSecondString;
public boolean mStatus;
}
并向BaseAdapter
提供此类的集合。 E.g
ArrayList<Item> mItems = new ArrayList<>();
getItem将返回mItem.get(position)
,在getView上您将设置文本和复选框。 E.g。
Item item = getItem(position);
CheckBox cb = (CheckBox) rootView.findViewById(R.id.the_checkBox);
cb.setChecked(item.mStatus);