1e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov/* 2e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * Copyright (C) 2010 The Android Open Source Project 3e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * 4e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License"); 5e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * you may not use this file except in compliance with the License. 6e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * You may obtain a copy of the License at 7e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * 8e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * http://www.apache.org/licenses/LICENSE-2.0 9e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * 10e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software 11e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS, 12e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * See the License for the specific language governing permissions and 14e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * limitations under the License. 15e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov */ 16e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 17e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovpackage com.android.contacts.widget; 18e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 19e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport com.android.contacts.R; 20e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 21e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.app.ListActivity; 22e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.content.Context; 23e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.database.Cursor; 24e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.database.MatrixCursor; 25e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.os.Bundle; 26e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.os.Handler; 27e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.view.LayoutInflater; 28e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.view.View; 29e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.view.ViewGroup; 30e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovimport android.widget.TextView; 31e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 32e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov/** 33e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * An activity that demonstrates various use cases for the {@link PinnedHeaderListView}. 34e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * If we decide to move PinnedHeaderListView to the framework, this class could go 35e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov * to API demos. 36e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov */ 37e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikovpublic class PinnedHeaderListDemoActivity extends ListActivity { 38e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 39e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov public final static class TestPinnedHeaderListAdapter extends PinnedHeaderListAdapter { 40e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 41e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov public TestPinnedHeaderListAdapter(Context context) { 42e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov super(context); 43e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov setPinnedPartitionHeadersEnabled(true); 44e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 45e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 46e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov private String[] mHeaders; 47e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov private int mPinnedHeaderCount; 48e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 49e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov public void setHeaders(String[] headers) { 50e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov this.mHeaders = headers; 51e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 52e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 53e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 54e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov protected View newHeaderView(Context context, int partition, Cursor cursor, 55e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov ViewGroup parent) { 56e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov LayoutInflater inflater = LayoutInflater.from(context); 57e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov return inflater.inflate(R.layout.list_section, null); 58e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 59e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 60e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 61e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov protected void bindHeaderView(View view, int parition, Cursor cursor) { 62e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov TextView headerText = (TextView)view.findViewById(R.id.header_text); 63e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov headerText.setText(mHeaders[parition]); 64e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 65e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 66e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 67e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov protected View newView(Context context, int partition, Cursor cursor, int position, 68e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov ViewGroup parent) { 69e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov LayoutInflater inflater = LayoutInflater.from(context); 70e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov return inflater.inflate(android.R.layout.simple_list_item_1, null); 71e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 72e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 73e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 74e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov protected void bindView(View v, int partition, Cursor cursor, int position) { 75e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov TextView text = (TextView)v.findViewById(android.R.id.text1); 76e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov text.setText(cursor.getString(1)); 77e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 78e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 79e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 80d5061fe322880ee993ea18db331fbc1110ddc538Dmitri Plotnikov public View getPinnedHeaderView(int viewIndex, View convertView, ViewGroup parent) { 81e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov LayoutInflater inflater = LayoutInflater.from(getContext()); 82e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov View view = inflater.inflate(R.layout.list_section, parent, false); 83e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov view.setFocusable(false); 84e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov view.setEnabled(false); 85e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov bindHeaderView(view, viewIndex, null); 86e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov return view; 87e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 88e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 89e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 90e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov public int getPinnedHeaderCount() { 91e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov return mPinnedHeaderCount; 92e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 93e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 94e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 95e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov private Handler mHandler = new Handler(); 96e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 97e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov @Override 98e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov protected void onCreate(Bundle bundle) { 99e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov super.onCreate(bundle); 100e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 101e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov setContentView(R.layout.pinned_header_list_demo); 102e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 103e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov final TestPinnedHeaderListAdapter adapter = new TestPinnedHeaderListAdapter(this); 104e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 105e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov Bundle extras = getIntent().getExtras(); 106e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov int[] counts = extras.getIntArray("counts"); 107e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov String[] names = extras.getStringArray("names"); 108e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov boolean[] showIfEmpty = extras.getBooleanArray("showIfEmpty"); 109e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov boolean[] hasHeader = extras.getBooleanArray("headers"); 110e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov int[] delays = extras.getIntArray("delays"); 111e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 112e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov if (counts == null || names == null || showIfEmpty == null || delays == null) { 113e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov throw new IllegalArgumentException("Missing required extras"); 114e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 115e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 116e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov adapter.setHeaders(names); 117e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov for (int i = 0; i < counts.length; i++) { 118e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov adapter.addPartition(showIfEmpty[i], names[i] != null); 119e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov adapter.mPinnedHeaderCount = names.length; 120e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 121e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov setListAdapter(adapter); 122e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov for (int i = 0; i < counts.length; i++) { 123e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov final int sectionId = i; 124e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov final Cursor cursor = makeCursor(names[i], counts[i]); 125e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov mHandler.postDelayed(new Runnable() { 126e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 127e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov public void run() { 128e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov adapter.changeCursor(sectionId, cursor); 129e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 130e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 131e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov }, delays[i]); 132e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 133e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 134e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov 135e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov private Cursor makeCursor(String name, int count) { 136e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov MatrixCursor cursor = new MatrixCursor(new String[]{"_id", name}); 137e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov for (int i = 0; i < count; i++) { 138e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov cursor.addRow(new Object[]{i, name + "[" + i + "]"}); 139e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 140e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov return cursor; 141e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov } 142e124722daa8a4b31308d53e3f0457c3b66a20ae5Dmitri Plotnikov} 143