这是我的问题:我有一个带有自定义ArrayAdapter的ListView:
onCreate()
中的我的列表:
list = /*some list*/
listView = (ListView) findViewById(R.id.some_list);
listView.setAdapter(new MapListAdapter(this, R.layout.custom_list_item, list));
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
listView.setItemChecked(position, true);
}
});
mapListView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(...) {
// some unrelated working code
}
@Override
public void onDestroyActionMode(...) {
// some unrelated working code
}
@Override
public boolean onCreateActionMode(...) {
// some unrelated working code
}
@Override
public boolean onActionItemClicked(...) {
// some unrelated working code
}
@Override
public void onItemCheckedStateChanged(...) {
// some unrelated working code
}
});
我的自定义ArrayAdapter的getView(...)
:
@Override
public View getView (int position, View view, ViewGroup parent) {
view = (LinearLayout) inflater.inflate(layoutId, null);
final ListItem entry = getItem(position);
// setting some textviews here and so on...
CheckBox checkBox = (CheckBox) view.findViewById(R.id.m_l_i_checkbox);
// my problem ^
return view;
}
我知道选择了某些列表项,因为ActionMode栏会在我选择它们时出现,并在我取消选择(切换)所有列表时消失。但是,我希望有一个checkBox来指示它们是否确实被选中。那我该怎么做?它适用于android.R.single_list_item_multiple_choice和默认的ArrayAdapter,但我想使用我的自定义。也许我出错了,还有另一种方法可以做到吗?
答案 0 :(得分:2)
我通过在Item类中添加名为isSelectedOnList(Boolean)的“特殊”字段来实现类似的行为自定义适配器。然后在OnItemClickListener中,我喜欢这样:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mapListView.setItemChecked(position, true);
...Get your item here...getItem(position).setIsSelectedOnList(!getItem(position).isSelectedOnList());
}
});
所以现在我的Items Array知道选择了哪些项目。然后在getView方法中,我更新了我的项目布局xml中的复选框:
@Override
public View getView (int position, View view, ViewGroup parent) {
view = (LinearLayout) inflater.inflate(layoutId, null);
final ListItem entry = getItem(position);
// setting some textviews here and so on...
CheckBox checkBox = (CheckBox) view.findViewById(R.id.m_l_i_checkbox);
// my problem ^
checkBox.setChecked(ListItem.isSelectedOnList());
return view;
}
这个解决方案对我很有用,所以我不关心在多选列表中选择项目的android内部机制。
希望这会有所帮助......
答案 1 :(得分:0)
我想我明白了! View getView (int position, View view, ViewGroup parent)
中的父实际上似乎是一个ListView,所以通过将其转换为ListView然后像这样使用......:
checkBox.setChecked(((ListView)parent).isItemChecked(position));
......单一选择有效!
现在,如果有人知道为什么多人仍然不这样做,那么我只是耳朵......或者眼睛:D
编辑:好的,它非常多! :(