3

Для приложения на основе ICS я создал ListFragment, который, в свою очередь, использует реализацию BaseAdapter. Я включил MultiChoiceModeListener(), чтобы отобразить панель контекстных действий. Но проблема здесь в том, что всякий раз, когда я проверяю CheckBox или долго нажимаю Label (оба находятся в представлении, установленном в BaseAdapter), реализация MultiChoiceModeListener вообще не вызывается. Любая помощь очень ценится, поскольку я полностью застрял после многих вариантов!Android: MultiChoiceModeListener не вызывается внутри ListFragment

public class ActivitiesFragment extends ListFragment { 

public void onActivityCreated(Bundle savedInstanceState) { 
    Log.d(TAG, "Entering onActivityCreated()"); 
    super.onActivityCreated(savedInstanceState); 

    this.setAdapter(); 
    this.setHasOptionsMenu(true); 
} 

private void setAdapter() { 

    HashMap<String, String> activities = DBAdapter 
      .getInstance(this.context).getActivities(); 
    setListAdapter(new ActivitiesList(Util.sortByComparator(activities))); 

    ListView listView = getListView(); 
    listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
    listView.setMultiChoiceModeListener(new MultiSelectionListener()); 

} 

private class ActivitiesList extends BaseAdapter { 
    // Other functions declared 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ActivityView view = null; 
     String activityName = this.activityList.get(position); 
     String colour = this.activities.get(activityName); 

     if (convertView == null) { 
      // ActivityView is a LinearLayout with CheckBox, Label and a Button 
      view = new ActivityView(context, activityName, colour); 

     } else { 
      view = (ActivityView) convertView; 
      view.setActivityName(activityName); 
     } 
     return view; 
    } 
} 

private class MultiSelectionListener implements MultiChoiceModeListener { 
    // implementation 
} 

} 

ответ

0

Вам необходимо использовать ActionMode.Callback. You should read through these docs, на самом деле он довольно прост в использовании.

+0

Я не пробовал ActionMode.Callback еще. Но разве это не используется для отдельных просмотров? Я ищу пакетное контекстное действие, где мне нужно выбрать несколько видов в этом списке. И я реализовал то же самое, о чем упоминается в ссылке разработчика Android. – Koottan

+0

'ActionMode' используется для выбора партии. – adneal

+2

Вы ошибаетесь. MultiChoiceModeListener предназначен для такого использования. Посмотрите на List16 в демонстрациях API. – pcu

-3

Возможно, в вашей реализации MultiChoiceModeListener есть ошибка. Он отлично работает для меня.

0

Вы должны проверить, нет ли в вашем списке onLongClickListener. У меня была та же проблема, что и мы с вами поняли, что длинный клик вызвал мой ViewHolder, поэтому MultiChoiceListener никогда не вызывался.

0

У меня была аналогичная проблема, в которой, хотя элементы, перечисленные в ListView, имели CheckBox, проверка их не вызывала бы MultiChoiceModeListener. Через некоторое исследование и посмотрите на образец под названием CustomChoiceList (который вы можете импортировать в Android Studio с File ->Import Sample), я узнал, что связанный View s с ListView должен реализовать интерфейс Checkable. Прямое цитирование из образца CustomChoiceList

Когда ListView имеет установленный параметр выбора, он позволит пользователям «выбрать» один или несколько элементов. Структура предоставляет стандартные элементы списка элементов, которые показывают стандартные переключатели или флажки рядом с одной строкой текста:

android.R.layout.simple_list_item_single_choice и android.R.layout.simple_list_item_multiple_choice.

В некоторых случаях вы можете настроить этот макет. При этом корневой вид должен реализовывать интерфейс Checkable.

Я знаю, что docs может быть более понятным о необходимости реализации интерфейса Checkable. Он говорит, что, хотя в последнем абзаце, что

Когда пользователь выбирает опцию, вы можете вызвать контекстную режим действия , установив соответствующий элемент списка проверяемого состояния с setItemChecked().

Вам не придется беспокоиться о ActionMode.Callback, так как он обрабатывается MultipleChoiceModeListener

Смежные вопросы