Android Listview - невозможно выбрать несколько элементов при использовании курсора - PullRequest
14 голосов
/ 31 марта 2012

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

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

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

Действительно потяну за это мои волосы, помогите пожалуйста !!1007 *

Вот код:

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);

Редактировать: Просто чтобы добавить дополнительную информацию, список с множественным выбором работает, если я использую этот код, где "items" - это простой массив String:

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

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

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

1 Ответ

1 голос
/ 27 апреля 2015

Я бы использовал режим 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;
  }
...