Селектор 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;
}
Поэтому я просто строю элементы списка снова после выбора элемента.