我有什么
我有一个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();
}
}
注意 - 我没有粘贴课程中的所有方法,因为它们不在这个问题的上下文中并且很长。
我的结果
此方法正确反转选择。但问题是副标题不正确,当我尝试选择/取消选择其他项目时,它们不会按预期工作。
我在这里做错了什么?任何帮助都非常感谢。
答案 0 :(得分:0)
尝试使用以下方法替换以反转选择。
public void inverseSel() {
// Get the checked positions
for (int i = 0; i < list.size(); i++) {
setNewSelection(i, !isPositionChecked(i));
}
notifyDataSetChanged();
}