在Android中访问ListView CheckBox

我正在android中创建一个待办事项列表应用程序。 一切都运行得很好,除了我在ListView中有复选框,我无法以编程方式设置。 我正在使用一个SQLite数据库来存储我的任务以及它们是否已标记为完成。 当我选中一个复选框时,它会在我的数据库中成功保存“1”。 我有一个updateUI方法,从我的数据库中读取我的任务文本并显示它。 我已经创建了一个新的“updateUICheckBox”方法来处理更新复选框的UI。 现在我只是试图将所有复选框设置为选中,但是当我调用setChecked(true)时,我得到一个nullpointerexception。

// not working private void updateUICheckBox() { CheckBox c = (CheckBox) findViewById(R.id.list_complete_check_box); c.setChecked(true); // null pointer exception } 

由于它是您正在设置CheckBox的ListView项,因此您需要在ListView本身的适配器中进行设置。 并操纵数据模型以检查或取消选中CheckBox。

通过扩展BaseAdapter来填充ListView来创建新类。 如果您具有要管理的UI对象超过1个的自定义布局,请不要使用ArrayAdapter

尝试在列表中添加标记

 public class Country { public String name; public String code; public String abbreviation; public boolean selected = false; //--> example this flag public int image; } 

适配器

 public class CountryCodeAdapter extends BaseAdapter { private Context context; private List countryList; public CountryCodeAdapter(Context context, List countryList) { this.context = context; this.countryList = countryList; } @Override public int getCount() { return countryList.size(); } @Override public Object getItem(int position) { return countryList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.adapter_country_code, parent, false); viewHolder = new ViewHolder(convertView); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } Country country = countryList.get(position); viewHolder.tv_item_country_name.setText(country.getName()); String plus = context.getResources().getString(R.string.plus); viewHolder.tv_item_country_code.setText(plus.concat(country.getCode())); int image = country.getImage(); if (image != -1) { viewHolder.iv_item_country.setImageResource(image); } return convertView; } public void updateList(List countryList) { this.countryList = countryList; notifyDataSetChanged(); } static class ViewHolder { @Bind(R.id.iv_item_country) ImageView iv_item_country; @Bind(R.id.tv_item_country_name) TextView tv_item_country_name; @Bind(R.id.tv_item_country_code) TextView tv_item_country_code; public ViewHolder(View view) { ButterKnife.bind(this, view); } } } 

如果要修改标志,请在适配器外部执行此操作

 CountryCodeAdapter adapter = new CountryCodeAdapter(activity, countryList); //eg. you may change the 1st element in countryList selected flag into true and //call updateList if (adapter != null) { adapter.updateList(countryList); } 

使用此标志在适配器内设置复选框。