0

ここに私の問題があります: カスタム 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 で問題なく動作しますが、カスタムのものを使用したいと考えています。多分私は何か間違っているので、それを行う別の方法がありますか?

4

1 に答える 1

2

isSelectedOnList (Boolean) という Item クラスに「特別な」フィールドを追加して、同様の動作のカスタム アダプターを実装します。次に、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 の内部メカニズムを調べる必要はありませんでした。

お役に立てれば...

于 2013-06-24T20:04:11.870 に答える