blob: a85336db6ec47b0ecbd5ed135ba4be34daa4ebad [file] [log] [blame]
/*
* Copyright (C) 2012 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 #package_name#;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import #ManifestPackageName#.R;
public class #class_name# extends ListActivity implements OnClickListener
{
private ArrayList<Integer> selectedItems = new ArrayList<Integer>();
private final String SELECTED_ITEM_KEY = "selected_items";
public final String TEXT_KEY_1 = "title";
public final String TEXT_KEY_2 = "description";
public final String ITEM_ID = "id";
public final String IMG_KEY = "img";
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.#layout_name#mult_selection_img/listviewmult.xml#);
findViewById(R.id.button).setOnClickListener(this);
// list data
List<Map<String, Object>> resourceNames = new ArrayList<Map<String, Object>>();
generateData(resourceNames);
MyAdapter notes = new MyAdapter(
this,
resourceNames,
R.layout.#layout_name#mult_selection_img/listrowmult.xml#,
new String[] { TEXT_KEY_1,TEXT_KEY_2, IMG_KEY, ITEM_ID },
new int[] { R.id.text1, R.id.text2, R.id.img},
selectedItems);
setListAdapter(notes);
}
private void generateData(List<Map<String, Object>> resourceNames)
{
//TODO here you will fill resourceNames with your own data
Map<String, Object> data;
int NUM_ITEMS = 50;
for ( int i = 0; i <= NUM_ITEMS; i++ )
{
data = new HashMap<String, Object>();
data.put(ITEM_ID, i);
data.put(TEXT_KEY_1, getString(R.string.list_item) + " " + Integer.toString(i) );
data.put(TEXT_KEY_2, getString(R.string.description));
data.put(IMG_KEY, R.drawable.#drawable_name#mult_selection_img/listicon.png# );
resourceNames.add(data);
}
}
/*
* Restores list selection
*/
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
selectedItems.addAll(state.getIntegerArrayList(SELECTED_ITEM_KEY));
}
/*
* When the device is rotated, this activity is killed
* This method is called when activity is about to be killed and saves
* the current list selection
*/
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntegerArrayList(SELECTED_ITEM_KEY, selectedItems);
}
/*
* Prints on screen the currently selected items
*/
public void onClick(View target)
{
//TODO execute your action here
StringBuilder strText = new StringBuilder();
strText.append(getString(R.string.selected));
Collections.sort(selectedItems);
boolean first = true;
for(Integer cur : selectedItems)
{
if(first)
{
strText.append(cur);
first = false;
}
else
{
strText.append(", " + cur);
}
}
Toast.makeText(getApplicationContext(), strText.toString(), Toast.LENGTH_LONG).show();
}
class MyAdapter extends SimpleAdapter
{
List<? extends Map<String, ?>> resourceNames;
OnItemClickListener listener = null;
ArrayList<Integer> selectedItems;
String[] strKeys;
int[] ids;
public MyAdapter(Context context, List<? extends Map<String, ?>> data,
int resource, String[] from, int[] to, ArrayList<Integer> selectedItems) {
super(context, data, resource, from, to);
this.selectedItems = selectedItems;
resourceNames = data;
strKeys = from;
ids = to;
}
/* Returns a view to be added on the list
* When we scroll the list, some items leave the screen becoming invisible to the user.
* Since creating views is an expensive task, we'd rather recycle these not visible views,
* that are referenced by convertView, updating its fields values.*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// used to improve performance, since we call findViewById
// only once for each created, but not recycled, view
ViewHolder holder;
if(listener == null)
listener = new OnItemClickListener(selectedItems);
//view to be recycled
if(convertView == null)
{
holder = new ViewHolder();
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.#layout_name#mult_selection_img/listrowmult.xml#, null);
holder.tv1 = (TextView) convertView.findViewById(R.id.text1);
holder.tv2 = (TextView) convertView.findViewById(R.id.text2);
holder.img = (ImageView) convertView.findViewById(R.id.img);
holder.ckb = (CheckBox) convertView.findViewById(R.id.ckb);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
Map<String, ?> currentData = resourceNames.get(position);
//updates list items values
holder.tv1.setText(currentData.get(strKeys[0]).toString());
holder.tv2.setText(currentData.get(strKeys[1]).toString());
holder.img.setImageResource((Integer) currentData.get(strKeys[2]));
holder.ckb.setChecked(selectedItems.contains((Integer) currentData.get(strKeys[3])));
convertView.setId((Integer) currentData.get(strKeys[3]));
convertView.setOnClickListener(listener);
return convertView;
}
}
/*
* Holds references to list items
*/
class ViewHolder
{
TextView tv1, tv2;
ImageView img;
CheckBox ckb;
}
/*
* Called when a list item is clicked
*/
class OnItemClickListener implements OnClickListener
{
ArrayList<Integer> selectedItems;
public OnItemClickListener(ArrayList<Integer> selectedItems)
{
this.selectedItems = selectedItems;
}
public void onClick(View v) {
//handles list item click
CheckBox ckb = (CheckBox) v.findViewById(R.id.ckb);
boolean checked = ckb.isChecked();
//updates selected list
if(checked)
{
selectedItems.remove(new Integer(v.getId()));
}
else
{
selectedItems.add(v.getId());
}
//update check box value
ckb.setChecked(!checked);
}
}
}