152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/*
252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * you may not use this file except in compliance with the License.
652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * You may obtain a copy of the License at
752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
1052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * See the License for the specific language governing permissions and
1452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * limitations under the License.
1552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
1652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpackage com.example.android.apis.view;
1852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
1952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.app.ListActivity;
2052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.content.Context;
2152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.os.Bundle;
2252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.view.LayoutInflater;
2352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.view.View;
2452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.view.ViewGroup;
2552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.widget.BaseAdapter;
2652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.widget.TextView;
2752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.widget.ImageView;
2852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.BitmapFactory;
2952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport android.graphics.Bitmap;
3052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectimport com.example.android.apis.R;
3152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
3252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project/**
3352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * Demonstrates how to write an efficient list adapter. The adapter used in this example binds
3452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * to an ImageView and to a TextView for each row in the list.
3552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
3652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * To work efficiently the adapter implemented here uses two techniques:
3752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * - It reuses the convertView passed to getView() to avoid inflating View when it is not necessary
3852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * - It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary
3952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project *
4052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * The ViewHolder pattern consists in storing a data structure in the tag of the view returned by
4152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * getView(). This data structures contains references to the views we want to bind data to, thus
4252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project * avoiding calls to findViewById() every time getView() is invoked.
4352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project */
4452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Projectpublic class List14 extends ListActivity {
4552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
4652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    private static class EfficientAdapter extends BaseAdapter {
4752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private LayoutInflater mInflater;
4852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Bitmap mIcon1;
4952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        private Bitmap mIcon2;
5052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public EfficientAdapter(Context context) {
5252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // Cache the LayoutInflate to avoid asking for a new one each time.
5352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mInflater = LayoutInflater.from(context);
5452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
5552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // Icons bound to the rows.
5652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_1);
5752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            mIcon2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_2);
5852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
5952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
6052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /**
6152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * The number of items in the list is determined by the number of speeches
6252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * in our array.
6352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         *
6452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * @see android.widget.ListAdapter#getCount()
6552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
6652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public int getCount() {
6752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            return DATA.length;
6852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
6952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
7052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /**
7152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * Since the data comes from an array, just returning the index is
7252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * sufficent to get at the data. If we were using a more complex data
7352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * structure, we would return whatever object represents one row in the
7452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * list.
7552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         *
7652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * @see android.widget.ListAdapter#getItem(int)
7752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
7852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public Object getItem(int position) {
7952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            return position;
8052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
8152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
8252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /**
8352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * Use the array index as a unique id.
8452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         *
8552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * @see android.widget.ListAdapter#getItemId(int)
8652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
8752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public long getItemId(int position) {
8852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            return position;
8952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
9052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
9152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        /**
9252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * Make a view to hold each row.
9352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         *
9452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         * @see android.widget.ListAdapter#getView(int, android.view.View,
9552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         *      android.view.ViewGroup)
9652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project         */
9752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
9852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // A ViewHolder keeps references to children views to avoid unneccessary calls
9952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // to findViewById() on each row.
10052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            ViewHolder holder;
10152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // When convertView is not null, we can reuse it directly, there is no need
10352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // to reinflate it. We only inflate a new View when the convertView supplied
10452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // by ListView is null.
10552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            if (convertView == null) {
10652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
10752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
10852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // Creates a ViewHolder and store references to the two children views
10952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // we want to bind data to.
11052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                holder = new ViewHolder();
11152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                holder.text = (TextView) convertView.findViewById(R.id.text);
11252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                holder.icon = (ImageView) convertView.findViewById(R.id.icon);
11352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
11452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                convertView.setTag(holder);
11552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            } else {
11652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // Get the ViewHolder back to get fast access to the TextView
11752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                // and the ImageView.
11852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project                holder = (ViewHolder) convertView.getTag();
11952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            }
12052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
12152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            // Bind the data efficiently with the holder.
12252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            holder.text.setText(DATA[position]);
12352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
12452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
12552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            return convertView;
12652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
12752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
12852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        static class ViewHolder {
12952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            TextView text;
13052d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project            ImageView icon;
13152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        }
13252d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
13352d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
13452d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    @Override
13552d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    public void onCreate(Bundle savedInstanceState) {
13652d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        super.onCreate(savedInstanceState);
13752d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project        setListAdapter(new EfficientAdapter(this));
13852d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project    }
13952d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project
140b39c4ba316a523e4ecf0ac9e71377b8c5b35c25cJeff Brown    private static final String[] DATA = Cheeses.sCheeseStrings;
14152d4c30ca52320ec92d1d1ddc8db3f07f69c4f98The Android Open Source Project}
142