如何在自定义ArrayAdapter中的CHOICE_MODE_MULTIPLE_MODAL中找出是否选择了项目?

时间:2013-06-24 19:35:45

标签: android checkbox android-listview listadapter android-actionmode

这是我的问题:我有一个带有自定义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,但我想使用我的自定义。也许我出错了,还有另一种方法可以做到吗?

2 个答案:

答案 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

编辑:好的,它非常多! :(