在android中删除ListView(cab)中的多个选定项

时间:2014-06-07 16:49:58

标签: java android android-listview android-actionbar

我想删除listview中的多个所选项目(行)(Gmail样式)。 如果我选择(使用longClick)一行,则没有任何反应。 我在互联网上找到了这段代码,我试图将它插入我的项目中。

MainActivity

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_lista, container,
            false);

    Lista = (ListView) rootView.findViewById(R.id.Lista);
    items = new ArrayList<ListViewItem>();
    items = GetLists.GetRecordList(rootView.getContext());
    adapter = new ListaAdapter(rootView.getContext(),
            R.layout.list_view_item, items);
    Lista.setAdapter(adapter);
    Lista.setMultiChoiceModeListener(this);
    Lista.setChoiceMode(Lista.CHOICE_MODE_MULTIPLE_MODAL);

    return rootView;
}

@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menu) {
    switch (menu.getItemId()) {
    case R.id.menu_delete:
        SparseBooleanArray selected = adapter.getSelectedIds();
        for (int i = (selected.size() - 1); i >= 0; i--) {
            if (selected.valueAt(i)) {
                ListViewItem selectedItem = adapter.getItem(selected
                        .keyAt(i));
                adapter.remove(selectedItem);
            }
        }
        actionMode.finish();
        return true;

    default:
        return false;
    }
}

@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
    actionMode.getMenuInflater().inflate(R.menu.delete_menu, menu);
    return false;
}

@Override
public void onDestroyActionMode(ActionMode arg0) {
    adapter.removeSelection();

}

@Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
    return false;
}

@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int position,
        long arg2, boolean arg3) {
    final int checkedOut = Lista.getCheckedItemCount();
    actionMode.setTitle(checkedOut + " selezionato");
    adapter.toggleSelection(position);

}

这是适配器

public class ListaAdapter extends ArrayAdapter<ListViewItem> {

private Context context;
private ArrayList<ListViewItem> items;
private SparseBooleanArray mSelectedItemsIds;

public ListaAdapter(Context context, int resourceId,
        ArrayList<ListViewItem> items) {
    super(context, resourceId, items);
    mSelectedItemsIds = new SparseBooleanArray();
    this.context = context;
    this.items = items;
}

private class ViewHolder {
    ImageView imageView;
    TextView txtTitle;
    TextView txtSubTitle;
}

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.list_view_item, null);
        holder = new ViewHolder();
        holder.txtTitle = (TextView) convertView
                .findViewById(R.id.TitoloPrincipale);
        holder.txtSubTitle = (TextView) convertView
                .findViewById(R.id.Sottotitolo);
        holder.imageView = (ImageView) convertView.findViewById(R.id.Image);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    ListViewItem list = getItem(position);
    holder.txtTitle.setText(list.getNomeFarmaco());
    holder.txtSubTitle.setText(list.getFasceOrarie());
    holder.imageView.setImageResource(list.getIcon());
    // convertView
    // .setBackgroundColor(mSelectedItemsIds.get(position)
    // : Color.TRANSPARENT);
    return convertView;

}

public void remove(ListViewItem item) {
    items.remove(item);
    notifyDataSetChanged();
}

public void toggleSelection(int position) {
    selectView(position, !mSelectedItemsIds.get(position));
}

public void removeSelection() {
    mSelectedItemsIds = new SparseBooleanArray();
    notifyDataSetChanged();
}

public void selectView(int position, boolean value) {
    if (value)
        mSelectedItemsIds.put(position, value);
    else
        mSelectedItemsIds.delete(position);

    notifyDataSetChanged();
}

public int getSelectedCount() {
    return mSelectedItemsIds.size();
}

public SparseBooleanArray getSelectedIds() {
    return mSelectedItemsIds;
}
你知道吗? TKS

3 个答案:

答案 0 :(得分:2)

该代码与长按无关。唯一出现的“long”是方法的long参数。 : - )

This sample project演示了基于列表行的长按启动的操作模式。关键是onItemLongClick()

  @Override
  public boolean onItemLongClick(AdapterView<?> parent, View view,
                                 int position, long id) {
    getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    getListView().setItemChecked(position, true);

    return(true);
  }

此处(由OnItemLongClickListener注册活动为ListView),我们切换CHOICE_MODE_MULTIPLE_MODAL并检查长按项目,从而激活操作模式。

答案 1 :(得分:0)

你没有像下面的列表视图一样设置MultiMoiceMisteListener的主要问题 (Plz,仔细查看onCreateActionMode和onActionItemClicked中的循环)

 listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);


            listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {

                @Override
                public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                    // TODO Auto-generated method stub
                    return false;
                }

                @Override
                public void onDestroyActionMode(ActionMode mode) {
                    // TODO Auto-generated method stub

                }

                @Override
                public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                    // TODO Auto-generated method stub
                    mode.getMenuInflater().inflate(R.menu.context_menu, menu);
                    return true;
                }

                @Override
                public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
                    // TODO Auto-generated method stub

                    switch (menuItem.getItemId()) {
                    case R.id.mnDelete:
                        SparseBooleanArray sparseBooleanArray = listView.getCheckedItemPositions();

                        for(int i = sparseBooleanArray.size() -1; i >= 0; i--)
                            items.remove(sparseBooleanArray.keyAt(i));

                        adapter.notifyDataSetChanged();
                        mode.finish();
                        break;

                    default:
                        break;
                    }
                    return true;
                }

            });
        }

答案 2 :(得分:0)

我已经解决了。谢谢大家。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_lista, container,
            false);

    Lista = (ListView) rootView.findViewById(R.id.Lista);
    items = new ArrayList<ListViewItem>();
    items = GetLists.GetRecordList(rootView.getContext());
    adapter = new ListaAdapter(rootView.getContext(),
            R.layout.list_view_item, items);
    Lista.setAdapter(adapter);
    Lista.setMultiChoiceModeListener(this);
    Lista.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
    return rootView;

}

@Override
public boolean onActionItemClicked(ActionMode arg0, MenuItem arg1) {
    switch (arg1.getItemId()) {
    case R.id.menu_delete:
        SparseBooleanArray selected = adapter.getSelectedIds();
        for (int i = (selected.size() - 1); i >= 0; i--) {
            if (selected.valueAt(i)) {
                ListViewItem selecteditem = adapter.getItem(selected
                        .keyAt(i));
                adapter.remove(selecteditem);
            }
        }
        // Close CAB
        arg0.finish();
        return true;
    default:
        return false;
    }
}

@Override
public boolean onCreateActionMode(ActionMode arg0, Menu arg1) {
    arg0.getMenuInflater().inflate(R.menu.delete_menu, arg1);
    return true;

}

@Override
public void onDestroyActionMode(ActionMode arg0) {
    adapter.removeSelection();
}

@Override
public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) {
    return false;
}

@Override
public void onItemCheckedStateChanged(ActionMode arg0, int arg1, long arg2,
        boolean arg3) {

    final int checkedCount = Lista.getCheckedItemCount();
    arg0.setTitle(checkedCount + " Selected");
    adapter.toggleSelection(arg1);
}

}