• Android ViewHolder模式


    这个ViewHolder到底是什么呢?我们可以在官方sample看到这段代码
    http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

    static class ViewHolder {
                TextView text;
                ImageView icon;
            }
    View Code

    可以看到它只是一个静态类,它的作用就在于减少不必要的调用findViewById
    完整的官方例子,官方例子中convertView 也是避免inflating View。
    然后把对底下的控件引用存在ViewHolder里面,再在View.setTag(holder)把它放在view里,下次就可以直接取了。

    /*
     * Copyright (C) 2008 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.example.android.apis.view;
     
    import android.app.ListActivity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
    import android.widget.ImageView;
    import android.graphics.BitmapFactory;
    import android.graphics.Bitmap;
    import com.example.android.apis.R;
     
    /**
     * Demonstrates how to write an efficient list adapter. The adapter used in this example binds
     * to an ImageView and to a TextView for each row in the list.
     *
     * To work efficiently the adapter implemented here uses two techniques:
     * - It reuses the convertView passed to getView() to avoid inflating View when it is not necessary
     * - It uses the ViewHolder pattern to avoid calling findViewById() when it is not necessary
     *
     * The ViewHolder pattern consists in storing a data structure in the tag of the view returned by
     * getView(). This data structures contains references to the views we want to bind data to, thus
     * avoiding calls to findViewById() every time getView() is invoked.
     */
    public class List14 extends ListActivity {
     
        private static class EfficientAdapter extends BaseAdapter {
            private LayoutInflater mInflater;
            private Bitmap mIcon1;
            private Bitmap mIcon2;
     
            public EfficientAdapter(Context context) {
                // Cache the LayoutInflate to avoid asking for a new one each time.
                mInflater = LayoutInflater.from(context);
     
                // Icons bound to the rows.
                mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_1);
                mIcon2 = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon48x48_2);
            }
     
            /**
             * The number of items in the list is determined by the number of speeches
             * in our array.
             *
             * @see android.widget.ListAdapter#getCount()
             */
            public int getCount() {
                return DATA.length;
            }
     
            /**
             * Since the data comes from an array, just returning the index is
             * sufficent to get at the data. If we were using a more complex data
             * structure, we would return whatever object represents one row in the
             * list.
             *
             * @see android.widget.ListAdapter#getItem(int)
             */
            public Object getItem(int position) {
                return position;
            }
     
            /**
             * Use the array index as a unique id.
             *
             * @see android.widget.ListAdapter#getItemId(int)
             */
            public long getItemId(int position) {
                return position;
            }
     
            /**
             * Make a view to hold each row.
             *
             * @see android.widget.ListAdapter#getView(int, android.view.View,
             *      android.view.ViewGroup)
             */
            public View getView(int position, View convertView, ViewGroup parent) {
                // A ViewHolder keeps references to children views to avoid unneccessary calls
                // to findViewById() on each row.
                ViewHolder holder;
     
                // When convertView is not null, we can reuse it directly, there is no need
                // to reinflate it. We only inflate a new View when the convertView supplied
                // by ListView is null.
                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
     
                    // Creates a ViewHolder and store references to the two children views
                    // we want to bind data to.
                    holder = new ViewHolder();
                    holder.text = (TextView) convertView.findViewById(R.id.text);
                    holder.icon = (ImageView) convertView.findViewById(R.id.icon);
     
                    convertView.setTag(holder);
                } else {
                    // Get the ViewHolder back to get fast access to the TextView
                    // and the ImageView.
                    holder = (ViewHolder) convertView.getTag();
                }
     
                // Bind the data efficiently with the holder.
                holder.text.setText(DATA[position]);
                holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
     
                return convertView;
            }
     
            static class ViewHolder {
                TextView text;
                ImageView icon;
            }
        }
     
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setListAdapter(new EfficientAdapter(this));
        }
     
        private static final String[] DATA = Cheeses.sCheeseStrings;
    View Code
  • 相关阅读:
    bq25896 IINDPM 及 無 IINDPM 時的 regsiter
    不同狀況下的 bq25896 register
    bq25896 charging status CHRG_STAT register 0xB
    快充 IC BQ25896 如何判斷 手機插著 adapter 充電器時,adapter Iout 大於限制,adapter Vout 小於 限制,導致 battery 不但沒充電且還需放電。
    在 kernel 下打出 有帶參數的log。 怪異現象與解決方式。
    mtk flash tool,Win7 On VirtualBox
    java 去最后一位字符 str.substring(0,str.length()-1)
    Windows下Oracle的下载与安装及配置
    关于Java中SQL语句的拼接规则
    <id name="ID"> <generator class="assigned" /> </id>
  • 原文地址:https://www.cnblogs.com/androidsj/p/3115688.html
Copyright © 2020-2023  润新知