Home | History | Annotate | Download | only in testingcamera2
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.testingcamera2;
     18 
     19 import android.content.Context;
     20 import android.util.Pair;
     21 import android.view.LayoutInflater;
     22 import android.view.View;
     23 import android.view.ViewGroup;
     24 import android.widget.ArrayAdapter;
     25 import android.widget.CheckBox;
     26 import android.widget.CompoundButton;
     27 
     28 import java.util.ArrayList;
     29 import java.util.List;
     30 
     31 /**
     32  * A specialized adapter containing an array of checkboxes.
     33  *
     34  * <p>
     35  * This adapter contains an array of pairs, where each pair represents the name and checked
     36  * state of a given item.
     37  * </p>
     38  */
     39 public class CheckableListAdapter extends ArrayAdapter<CheckableListAdapter.CheckableItem> {
     40     private Context mContext;
     41 
     42     public CheckableListAdapter(Context context, int resource, List<CheckableItem> objects) {
     43         super(context, resource, objects);
     44         mContext = context;
     45     }
     46 
     47     public static class CheckableItem {
     48         public String name;
     49         public boolean isChecked;
     50 
     51         public CheckableItem(String name, boolean isChecked) {
     52             this.name = name;
     53             this.isChecked = isChecked;
     54         }
     55     }
     56 
     57     @Override
     58     public View getView(final int position, View convertView, ViewGroup parent) {
     59         CheckBox row = (CheckBox) convertView;
     60         if (row == null) {
     61             LayoutInflater inflater =
     62                     (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     63             row = (CheckBox) inflater.inflate(R.layout.checkable_list_item, parent, false);
     64         }
     65         CheckableItem item = getItem(position);
     66         row.setChecked(item.isChecked);
     67         row.setText(item.name);
     68 
     69         row.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
     70             @Override
     71             public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
     72                 CheckableItem item = getItem(position);
     73                 item.isChecked = b;
     74             }
     75         });
     76         return row;
     77     }
     78 
     79     /**
     80      * Returns a list containing the indexes of the currently checked items.
     81      *
     82      * @return a {@link java.util.List} of indices.
     83      */
     84     public List<Integer> getCheckedPositions() {
     85         ArrayList<Integer> checkedPositions = new ArrayList<Integer>();
     86         int size = getCount();
     87         for (int i = 0; i < size; i++) {
     88             CheckableItem item = getItem(i);
     89             if (item.isChecked) {
     90                 checkedPositions.add(i);
     91             }
     92         }
     93 
     94         return checkedPositions;
     95     }
     96 
     97     /**
     98      * Update the items in this list.  Checked state will be preserved for items that are
     99      * still included in the list.
    100      *
    101      * @param elems a list of strings that represents the names of the items to be included.
    102      */
    103     public void updateItems(String[] elems) {
    104         ArrayList<CheckableItem> newList = new ArrayList<CheckableItem>();
    105         for (String e : elems) {
    106             CheckableItem item = new CheckableItem(e, false);
    107             newList.add(item);
    108             boolean newItem = true;
    109             int size = getCount();
    110             for (int i = 0; i < size; i++) {
    111                 CheckableItem current = getItem(i);
    112                 if (current.name.equals(e) && current.isChecked) {
    113                     item.isChecked = true;
    114                     newItem = false;
    115                 }
    116             }
    117             if (newItem) {
    118                 item.isChecked = newItem;
    119             }
    120         }
    121         clear();
    122         addAll(newList);
    123         notifyDataSetChanged();
    124     }
    125 
    126 }
    127