Ответ 1
Это возможно, но просто... На самом деле я не знаю, как такая простая вещь может закончиться настолько смехотворно сложной.
Ключ к ответу можно найти здесь: Android: сохранить синий фон после выбора ListView
Для этого нужно определить дополнительный стиль, который используется ListView
, и установить режим выбора на AbsListView.CHOICE_MODE_SINGLE
(как объяснено в связанном ответе).
Это позволяет программно переключаться с помощью Listview.setItemChecked()
. Тем не менее, вам нужно отслеживать индекс затронутого элемента в обратном вызове onItemLongClick
самостоятельно, потому что ListView.setSelection()
не сделает этого (по крайней мере ListView.getSelectedItem()
всегда будет возвращать -1, насколько я вижу).
Код (для простоты мой фрагмент реализует все три OnItemClickListener
, OnItemLongClickListener
и ActionMode.Callback
):
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
this.listViewAdapter = new ListViewAdapter();
this.root = (ListView)inflater.inflate(R.layout.fragment_bookmarks, container, false);
this.root.setAdapter(this.listViewAdapter);
this.root.setOnItemClickListener(this);
this.root.setOnItemLongClickListener(this);
this.root.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
return this.root;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if(this.cabMode != null)
return false;
this.selectedPosition = position;
this.root.setItemChecked(position, true);
this.root.setOnItemClickListener(null);
this.cabMode = getActivity().startActionMode(this);
return true;
}
И, наконец, если вы хотите избавиться от выбора, когда CAB закрыт:
@Override
public void onDestroyActionMode(ActionMode mode) {
cabMode = null;
this.root.setItemChecked(this.selectedPosition, false);
this.selectedPosition = -1;
this.root.setOnItemClickListener(this);
}
Регистрация и отмена регистрации OnItemClickListener
гарантирует, что пока CAB активен, вы случайно не будете запускать действие, обычно связанное с элементом (например, открытие подробного представления).