android viewholder模式,Android ViewHolder模式

static class ViewHolder {

TextView text;

ImageView icon;

}

可以看到它只是一个静态类,它的作用就在于减少不必要的调用findViewById

完整的官方例子,官方例子中convertView 也是避免inflating View。

然后把对底下的控件引用存在ViewHolder里面,再在View.setTag(holder)把它放在view里,下次就可以直接取了。

效率相差多少?看这篇文章:Android开发之ListView 适配器(Adapter)优化

/*

* 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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值