blob: d5a7ad3147dc505c1ce4741facc29d7e87fbea9a [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.testingcamera2;
import android.content.Context;
import android.util.Pair;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import java.util.ArrayList;
import java.util.List;
/**
* A specialized adapter containing an array of checkboxes.
*
* <p>
* This adapter contains an array of pairs, where each pair represents the name and checked
* state of a given item.
* </p>
*/
public class CheckableListAdapter extends ArrayAdapter<CheckableListAdapter.CheckableItem> {
private Context mContext;
public CheckableListAdapter(Context context, int resource, List<CheckableItem> objects) {
super(context, resource, objects);
mContext = context;
}
public static class CheckableItem {
public String name;
public boolean isChecked;
public CheckableItem(String name, boolean isChecked) {
this.name = name;
this.isChecked = isChecked;
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
CheckBox row = (CheckBox) convertView;
if (row == null) {
LayoutInflater inflater =
(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = (CheckBox) inflater.inflate(R.layout.checkable_list_item, parent, false);
}
CheckableItem item = getItem(position);
row.setChecked(item.isChecked);
row.setText(item.name);
row.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
CheckableItem item = getItem(position);
item.isChecked = b;
}
});
return row;
}
/**
* Returns a list containing the indexes of the currently checked items.
*
* @return a {@link java.util.List} of indices.
*/
public List<Integer> getCheckedPositions() {
ArrayList<Integer> checkedPositions = new ArrayList<Integer>();
int size = getCount();
for (int i = 0; i < size; i++) {
CheckableItem item = getItem(i);
if (item.isChecked) {
checkedPositions.add(i);
}
}
return checkedPositions;
}
/**
* Update the items in this list. Checked state will be preserved for items that are
* still included in the list.
*
* @param elems a list of strings that represents the names of the items to be included.
*/
public void updateItems(String[] elems) {
ArrayList<CheckableItem> newList = new ArrayList<CheckableItem>();
for (String e : elems) {
CheckableItem item = new CheckableItem(e, false);
newList.add(item);
boolean newItem = true;
int size = getCount();
for (int i = 0; i < size; i++) {
CheckableItem current = getItem(i);
if (current.name.equals(e) && current.isChecked) {
item.isChecked = true;
newItem = false;
}
}
if (newItem) {
item.isChecked = newItem;
}
}
clear();
addAll(newList);
notifyDataSetChanged();
}
}