Android Listview - 使用游标时无法选择多个项目

Mau*_*Mau 14 android listview multi-select simplecursoradapter

我有一个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);
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了添加一些额外的信息,如果我使用这个代码,多选项列表视图工作,其中"项目"是一个简单的字符串数组:

lv.setAdapter(new ArrayAdapter(this.getActivity(),
            android.R.layout.simple_list_item_multiple_choice, items));
Run Code Online (Sandbox Code Playgroud)

此外,此listview将动态添加到包含其他控件的dialogfragment中的现有Linearlayout(attributesLinearLayout).我也尝试扩展其他适配器,包括阵列适配器和客户项目布局,但这又不允许我选择多个项目.

请帮忙!!

Mic*_*rla 2

Contextual Action如果您希望在列表视图中选择多个项目,我将在该项目中使用该模式。就是这样完成的。

首先,代码必须扩展 aListActivity并实现一个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;
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

您需要调用 show 方法:

private void show() {
    Toast.makeText(MyListActivityActionbar.this, String.valueOf(selectedItem), Toast.LENGTH_LONG).show();
  }
Run Code Online (Sandbox Code Playgroud)

每次显示操作模式时都需要调用以下内容。它总是在之后调用onCreateActionMode,但如果模式无效,则可能会被多次调用:

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

那么当用户选择列表项时,需要调用以下方法:

  @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;
    }
  }
Run Code Online (Sandbox Code Playgroud)

最后当用户退出选择时:

  @Override
  public void onDestroyActionMode(ActionMode mode) {
    mActionMode = null;
    selectedItem = -1;
  }
Run Code Online (Sandbox Code Playgroud)