在Android中的ListView中进行反向选择

时间:2015-06-25 05:12:18

标签: android listview

我有什么

我有一个ListView哪个Contextual Action Bar。在CAB中,我有一个选项“Select All”,它选择列表中的所有项目。它运作得很好。

我想要什么

我想提供一个选项来反转选择。比如,假设列表中有10个项目,并且用户选择前两个项目并选择“反向”选项,则将选择8个项目中的其余项目。

示例 - 此选项可在Solid Explorer等常用文件管理器中找到。

我做了什么

public class FileBrowserAdapter extends BaseAdapter{

        List<FileItem> list = Collections.emptyList();
        List<FileItem> mStringFilterList = Collections.emptyList();
        ValueFilter valueFilter;

        private HashMap<Integer, Boolean> mSelection = new HashMap<Integer, Boolean>();

        public FileBrowserAdapter(Context context, List<FileItem> list) {

            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            this.list = list;
            this.context = context;
            mStringFilterList = list;

        }

        public void setNewSelection(int position, boolean value) {

            mSelection.put(position, value);
            notifyDataSetChanged();
        }

        public boolean isPositionChecked(int position) {
            Boolean result = mSelection.get(position);
            return result == null ? false : result;
        }

        public Set<Integer> getCurrentCheckedPosition() {
            return mSelection.keySet();
        }

        public void removeSelection(int position) {
            mSelection.remove(position);
            notifyDataSetChanged();
        }

        public void clearSelection() {
            mSelection = new HashMap<Integer, Boolean>();
            notifyDataSetChanged();
        }

        public void selectAll() {

            for (int i = 0; i < list.size(); i++) {
                setNewSelection(i, true);
            }
            notifyDataSetChanged();
        }

        public void inverseSel(){

            // Get the checked positions
            Set<Integer> selectedItems = mSelection.keySet();

            ArrayList<Integer> selected = new ArrayList<>();
            ArrayList<Integer> invSelected = new ArrayList<>();

            // Get the selected items
            for(int i: selectedItems){
                selected.add(i);
            }

            //Inverse the selection
            for(int i = 0; i<list.size(); i++){

                int flag = 1;
                for(int j = 0; j<selected.size(); j++){

                    if(i == selected.get(j)){
                        flag = 0;
                        break;
                    }
                }

                if(flag == 1)
                    invSelected.add(i);

            }

            mSelection.clear();

            for(int i: invSelected){
                mSelection.put(i, true);
            }

            notifyDataSetChanged();

        }

}

注意 - 我没有粘贴课程中的所有方法,因为它们不在这个问题的上下文中并且很长。

我的结果

此方法正确反转选择。但问题是副标题不正确,当我尝试选择/取消选择其他项目时,它们不会按预期工作。

我在这里做错了什么?任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:0)

尝试使用以下方法替换以反转选择。

public void inverseSel() {
        // Get the checked positions
        for (int i = 0; i < list.size(); i++) {
            setNewSelection(i, !isPositionChecked(i));
        }
      notifyDataSetChanged();
    }