【发布时间】:2015-03-16 13:05:49
【问题描述】:
我创建了自己的适配器 InteractiveArrayAdapter,并将其设置为我在我的 xml 布局文件中的列表视图 (MyListView) 的适配器,比如说 MyActivity。然后,从 MyActivity 活动中,我执行以下操作:
MyActivity.java:
ListView listView = (ListView) findViewById(R.id.MyListView);
ArrayAdapter<Model> adapter = new InteractiveArrayAdapter(this, model);
listView.setAdapter(adapter);
我的自定义适配器使用我创建的自定义模型 Model 来处理列表视图中的每个元素。每个列表视图项,由一个 TextView 和一个 CheckBox 组成。
我的目标是在用户按下放置在 MyActivity xml 布局文件中的提交按钮时获取已检查项目的完整列表,因此我执行以下步骤来消除此问题:
-
在我的自定义适配器 InteractiveArrayAdapter 中,我声明了一个私有 Set 来存储列表视图中选择的每个元素的标识符。我使用自己的标识符而不是使用列表中的位置。此标识符来自数据库中的主键,在上一步中,我从中提取了所有所需的项目以填充列表视图。由于项目的标识符不能重复,因此我使用了 Set。每次选中或取消选中列表视图中的项目时,都会更新此 Set。我还实现了一个公共方法来返回这个集合。
public class InteractiveArrayAdapter extends ArrayAdapter<Model> { ... private Set<Integer> checked = new HashSet<Integer>(); ... @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; viewHolder.checkbox = (CheckBox) view.findViewById(R.id.interactiveRowCheck); viewHolder.checkbox .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Model element = (Model) viewHolder.checkbox .getTag(); element.setSelected(buttonView.isChecked()); Integer id = element.getId(); if (isChecked) { checked.add(id); } else if (checked.contains(id)) { checked.remove(id); } } }); } public Set<Integer> getCheckedItems() { return this.checked; } } -
在 MyActivity.java 我处理点击按钮并尝试阅读 通过这样做检查的项目列表:
public void OnClickCompareButton(View view) { InteractiveArrayAdapter adapter; Set<Integer> checkedItems = adapter.getCheckedItems(); Iterator<Integer> it = checkedItems.iterator(); int size = checkedItems.size(); for (int i = 0; i < size; i++) { // Do whatever... } }
但 Android Studio 在编译时抛出错误:
Error:(82, 37) error: variable adapter might not have been initialized
如果那我在设置适配器时使用了本文开头初始化的变量adapter,即:
public void OnClickCompareButton(View view) {
Set<Integer> checkedItems = this.adapter.getCheckedItems();
Iterator<Integer> it = checkedItems.iterator();
int size = checkedItems.size();
for (int i = 0; i < size; i++) {
// Do whatever...
}
}
编译时显示以下错误:
Error:(82, 49) error: cannot find symbol method getCheckedItems()
那么如何解决呢?
【问题讨论】:
标签: android android-listview android-adapter