Селектор Android ListItem не работает с MultiChoiceModeListener

Я реализовал CAB и MultiChoiceModeListener на ListView, и все работает отлично, за исключением изменения цвета фона элемента списка при выборе (множественный выбор). Вот мой код:

listView.xml:

<ListView 
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="#ebebeb"
    android:dividerHeight="1dip"
    android:listSelector="@drawable/list_selector"/>

list_selector:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:drawable="@android:color/holo_green_light"/>
<item android:state_pressed="true" android:drawable="@android:color/holo_blue_light"/>
<item android:state_focused="true" android:drawable="@android:color/holo_blue_dark"/>
<item android:drawable="@android:color/white"/>
</selector>

Фрагмент:

l.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
l.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
        @Override
        public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) {
            int checkedCount = l.getCheckedItemCount();
            mode.setTitle(checkedCount + " Selected");
        }

        @Override
        public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
            return true;
        }

        @Override
        public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
        }

        @Override
        public void onDestroyActionMode(android.view.ActionMode mode) {
        }
    });

1 ответ

Я сохранил данные об элементах, чтобы увидеть, был ли он выбран, а затем просто вызвал адаптер notifyDataSetChanged чтобы снова создать вид. В моем случае речь шла об изменении значка в списке элементов.

Это актуально MultiChoiceModeListener часть:

mylist.setMultiChoiceModeListener(new MultiChoiceModeListener()
    {

        private int numberOfSelected = 0;

        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked)
        {
            // Here you can do something when items are
            // selected/de-selected,
            // such as update the title in the CAB
            if (checked)
            {
                numberOfSelected++;
            } else
            {
                numberOfSelected--;
            }
            mode.setTitle(numberOfSelected + " items selected");
            itemsData.get(position).isChecked = checked; //a collection of data item's status
            m_listAdapter.notifyDataSetChanged();
        }
        ...

И вот что я сделал в адаптере:

@Override
    public View getView(int position, View convertView, ViewGroup parent)
    {

        View vi = convertView;
        if (vi == null)
        {
            vi = m_inflater.inflate(R.layout.item_view, null);
        }

        ImageView theIcon = (ImageView) vi.findViewById(R.id.icon);
        if (dataItems.get(position).isChecked)
        {
            theIcon.setImageResource(R.drawable.icon1);
        } else
        {
            contactIcon.setImageResource(R.drawable.icon2);
        }
        return vi;
    }

Поэтому я просто строю элементы списка снова после выбора элемента.

Другие вопросы по тегам