Android Listview - невозможно выбрать несколько элементов при использовании курсора

У меня есть список, заполненный данными из курсора с использованием SimpleCursorAdapter. Я хочу сделать так, чтобы я мог выбирать несколько элементов с флажком напротив каждого элемента, но я могу заставить его проверять только один элемент за раз, т.е. каждый раз, когда я выбираю элемент, он очищает текущий выбранный элемент.

Он отлично работает, если я заполняю список с помощью ArrayAdapter. Я могу выбрать несколько элементов. Поэтому я не знаю, почему это не работает с SimpleCursorAdapter.

Это создается в DialogFragment, если это имеет значение.

На самом деле рву на себе волосы, пожалуйста, помогите!!

Вот код:

Cursor attributesCursor = mDBHelper.getItemAttributesbyType(menuID, itemID, "M");
getActivity().startManagingCursor(attributesCursor);

ListView lv = new ListView(this.getActivity());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
lv.setLayoutParams(params);


SimpleCursorAdapter adapter = new SimpleCursorAdapter(
                getActivity(), android.R.layout.simple_list_item_multiple_choice,
                attributesCursor, new String[] { "AttributeDescription" },
                new int[] { android.R.id.text1 },0);


attributesLinearLayout.addView(lv);

lv.setAdapter(adapter);

lv.setItemsCanFocus(false);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

Изменить: просто чтобы добавить дополнительную информацию, список с несколькими вариантами выбора работает, если я использую этот код, где «элементы» - это простой массив строк:

lv.setAdapter(new ArrayAdapter(this.getActivity(),
            android.R.layout.simple_list_item_multiple_choice, items));

Кроме того, это представление списка динамически добавляется к существующему Linearlayout (attributesLinearLayout) во фрагменте диалога, который содержит другие элементы управления. Я также попытался расширить другие адаптеры, включая адаптер массива и макеты элементов клиента, но это снова не позволило мне выбрать несколько элементов.

Пожалуйста помоги!!


person Mau    schedule 30.03.2012    source источник
comment
вы нашли какое-то решение, у меня тоже такая же проблема   -  person dmSherazi    schedule 27.04.2015
comment
Почему бы вам не использовать адаптер Custom Cursor? Или если бы я дал вам специальный адаптер с включенным множественным выбором. Решит ли это вашу проблему?   -  person Droidekas    schedule 27.04.2015
comment
Если он работает как ArrayAdapter, можете ли вы просто скопировать данные из курсора в массив, а затем использовать адаптер массива?   -  person Suragch    schedule 01.05.2015


Ответы (1)


Я бы использовал режим Contextual Action в этом проекте, если вы хотите выбрать несколько элементов в списке. Вот как это делается.

Прежде всего, код должен расширять ListActivity и реализовывать ActionMode.Callback.

В методе onCreate вам нужно закодировать следующее:

@Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    String[] values = new String[] { "data list goes here" };

    MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values);
    setListAdapter(adapter);

    getListView().setOnItemLongClickListener(new OnItemLongClickListener() {

      @Override
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {

        if (mActionMode != null) {
          return false;
        }
        selectedItem = position;

        // Start the CAB using the ActionMode.Callback defined above
        mActionMode = MyListActivityActionbar.this.startActionMode(MyListActivityActionbar.this);
        view.setSelected(true);
        return true;
      }
    });
  }

Вам нужно вызвать метод show:

private void show() {
    Toast.makeText(MyListActivityActionbar.this, String.valueOf(selectedItem), Toast.LENGTH_LONG).show();
  }

Следующее необходимо вызывать каждый раз, когда отображается режим действия. Он всегда вызывается после onCreateActionMode, но может вызываться несколько раз, если режим недействителен:

  @Override
  public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false; // Return false if nothing is done
  }

Затем, когда пользователь выбирает элемент списка, необходимо вызвать следующий метод:

  @Override
  public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menuitem1_show:
      show();
      // Action picked, so close the CAB
      mode.finish();
      return true;
    default:
      return false;
    }
  }

Наконец, когда пользователь выходит из выделения:

  @Override
  public void onDestroyActionMode(ActionMode mode) {
    mActionMode = null;
    selectedItem = -1;
  }
person Michele La Ferla    schedule 27.04.2015
comment
Я смог сделать это для адаптера массива, но для пользовательского адаптера, который расширяет адаптер курсора, actionMode не активируется. - person dmSherazi; 27.04.2015
comment
Почему вам нужно использовать CursorAdapter? - person Michele La Ferla; 27.04.2015
comment
Когда данные загружаются из базы данных. - person dmSherazi; 27.04.2015
comment
База данных находится в сети или вызывается через sqlLite? - person Michele La Ferla; 27.04.2015
comment
Я имею в виду, что приложение имеет базу данных для хранения входящих и исходящих сообщений... Я использую курсор, чтобы получить все необходимые данные для сообщений из базы данных и показать их в представлении разговора. - person dmSherazi; 27.04.2015
comment
Тогда это база данных sqllite. Взгляните на это руководство: vogella.com/tutorials/AndroidSQLite/article.html - person Michele La Ferla; 27.04.2015