Подтвердить что ты не робот

Как выбрать элемент ListView после длительного клика?

У меня есть глупая маленькая проблема. Я зарегистрировал ListFragment как OnItemClickListener и OnItemLongClickListener своего собственного ListView.

Когда вызывается событие onItemClick, запускается намерение для активности подробного представления этого элемента, никаких проблем нет.

Когда происходит событие onItemLongClick, я хочу выполнить следующие действия:

  • Создать CAB
  • Сохраняйте выбранный длинный файл

код:

@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    if(this.cabMode != null)
        return false;
    this.cabMode = getActivity().startActionMode(editModeCallback);
    view.setSelected(true);
    return true;
}

CAB покажет, что выбор не останется с элементом.

Некоторые бит и куски, если они имеют значение: я прочитал об исправлении этой проблемы с вызовами view.requestFocusFromTouch() или с помощью listView.setItemChecked(), но это не сработало для меня. Кроме того, представления элементов списка отображаются из пользовательского макета, но не имеют каких-либо пользовательских прослушивателей событий.

Любая помощь приветствуется. спасибо!

4b9b3361

Ответ 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 активен, вы случайно не будете запускать действие, обычно связанное с элементом (например, открытие подробного представления).

Ответ 2

Мое решение: (трюк)

final ListView lvMain = (ListView) activity.findViewById(R.id.listTHEMES);
lvMain.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lvMain.setItemsCanFocus(false);

ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
            android.R.layout.simple_list_item_multiple_choice, ArrayTheme);
lvMain.setAdapter(adapter);
lvMain.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                                       int pos, long id) {
        // TODO Auto-generated method stub
        if (lvMain.isItemChecked(pos)){lvMain.setItemChecked(pos,false);}else{lvMain.setItemChecked(pos,true);}
        Log.v(LOG_TAG,"long clicked pos: " + pos);
        //lvMain.setSelection();

        return true;
    }
});
lvMain.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
        //Log.d(LOG_TAG, "itemClick: position = " + position + ", id = " + id);
        if (lvMain.isItemChecked(position)){lvMain.setItemChecked(position,false);}else{lvMain.setItemChecked(position,true);}

    }
});