ListView 编程: 如何优化自定义 Adapter
来源:互联网 发布:mac 文件夹灰色打不开 编辑:程序博客网 时间:2024/06/02 11:37
出处:http://blog.csdn.net/androidbluetooth/article/details/6960936
使用自定义的 Adapter,需要优化,说到底是优化我们自定义的适配器类!
再说到底就是优化回调方法 getView 方法。
利用 convertView 这个参数,而不去在 getView 方法中重新创建一个临时的变量 View 了,
那么可以减轻虚拟机(回收)的负担,从而提高效率。
方案 1_ 优化代码: 使用 convertView
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("mark", "getView() is invoked!" + "position = " + position + ","
+ "convertView = " + convertView + "," + "parent = " + parent);
if (convertView == null) {
convertView = inflater.inflate(R.layout.custom_fileview, null);
}
((ImageView) convertView.findViewById(R.id.image_pic))
.setImageResource(R.drawable.file);
((TextView) convertView.findViewById(R.id.text_content))
.setText("fileName");
return convertView;
}
可以看出,只有 convertView == null 为真(上面测试已经说明 convertView 何时为 null),
才去创建 View 对象。
如果你有兴趣的话,可以再次运行 APP 可以看出从底部再次滚动到顶部,
反复几次,你会发现几乎很少创建 View 对象,而是重复利用原来已经存在的 View 对象。
下面还有一种方式来优化代码,不说是最好但至少是 even better (Google 推荐)!
方案 2_ 优化代码:hold 一把
在 android 提供的 APIDemo 中(List14.java)使用了 ViewHolder ,
所以 ViewHolder 不是 android 自带的 api,也不是什么诡异的东西。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("mark", "getView() is invoked!" + "position = " + position + ","
+ "convertView = " + convertView + "," + "parent = " + parent);
ViewHolder vHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.custom_fileview, null);
// 創建 ViewHodler 對象
vHolder = new ViewHolder();
vHolder.pic = (ImageView) convertView.findViewById(R.id.image_pic);
vHolder.content = (TextView) convertView
.findViewById(R.id.text_content);
// 設置 Tag
convertView.setTag(vHolder);
} else {
vHolder = (ViewHolder) convertView.getTag();
}
vHolder.pic.setImageResource(R.drawable.file);
vHolder.content.setText("fileName");
return convertView;
}
其中 ViewHolder 是 FileViewAdapter 的 一个静态内部类。
static class ViewHolder {
TextView content;
ImageView pic;
}
使用 ViewHolder 的关键好处是缓存了显示数据的视图,加快了 UI 的响应速度。
到目前为止,仿佛优化工作已经 ok,其实,
还有一个小问题: ImageView 使用的图片资源需要预处理。
FileViewAdapter 完整的代码如下:
- package mark.zhang;
- import java.util.ArrayList;
- import android.content.Context;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.TextView;
- public class FileViewAdapter extends BaseAdapter {
- private LayoutInflater inflater = null;
- private ArrayList<String> arrays = null;
- private Bitmap showIcon = null;
- public FileViewAdapter(Context context, ArrayList<String> arrays) {
- this.arrays = arrays;
- inflater = LayoutInflater.from(context);
- // 處理圖片資源
- showIcon = BitmapFactory.decodeResource(context.getResources(),
- R.drawable.file);
- }
- @Override
- public int getCount() {
- // Log.d("mark", "getCount() is invoked!");
- // 返回需要顯示的 item 數目
- // 這次是外界提供的數據,與上次代碼有差異
- return arrays.size();
- }
- @Override
- public Object getItem(int position) {
- // Log.d("mark", "getItem() is invoked!");
- return position;
- }
- @Override
- public long getItemId(int position) {
- // Log.d("mark", "getItemId() is invoked!");
- // Log.d("mark", "position = " + position);
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- Log.d("mark", "getView() is invoked!" + "position = " + position + ","
- + "convertView = " + convertView + "," + "parent = " + parent);
- ViewHolder vHolder = null;
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.custom_fileview, null);
- // 創建 ViewHodler 對象
- vHolder = new ViewHolder();
- vHolder.pic = (ImageView) convertView.findViewById(R.id.image_pic);
- vHolder.content = (TextView) convertView
- .findViewById(R.id.text_content);
- // 設置 Tag
- convertView.setTag(vHolder);
- } else {
- vHolder = (ViewHolder) convertView.getTag();
- }
- // 設置位圖
- vHolder.pic.setImageBitmap(showIcon);
- vHolder.content.setText("fileName");
- return convertView;
- }
- static class ViewHolder {
- TextView content;
- ImageView pic;
- }
- }
最后强调一下,要在布局文件里面将 ListView 控件的属性设置为:
android:layout_width="fill_parent"
android:layout_height="fill_parent"
关于 ListView 的工作原理(Recycler)以及如何进一步优化 ListView,可以参考
http://mzh3344258.blog.51cto.com/1823534/889879
Google IO 文档下载
http://download.csdn.net/detail/androidbluetooth/3783925
- ListView 编程: 如何优化自定义 Adapter
- ListView 编程: 如何优化自定义 Adapter
- ListView 编程: 如何优化自定义 Adapter
- 自定义Adapter中对ListView的优化
- 0825Android基础ListView自定义Adapter优化
- 使用自定义Adapter的ListView优化方式
- ListView的自定义Adapter的性能优化
- Listview Adapter 优化总结
- ListView的Adapter优化
- listView的 Adapter优化
- listview 自定义Adapter
- listview 自定义Adapter
- 自定义Adapter与ListView
- ListView使用自定义Adapter
- ListView 自定义Adapter
- 自定义ListView的Adapter
- 自定义Adapter的ListView
- 自定义listview的adapter
- 部署flask应用到nginx和tornado
- AR
- MFC中OnTimer的应用
- Golang 类型转换整理
- Hibernate中Criteria的完整用法
- ListView 编程: 如何优化自定义 Adapter
- 透明度动画、旋转动画、尺寸伸缩动画、移动动画参数详解
- Eclipse中tomcat修改端口号
- System.in引发的问题
- python模块之argparse:强大的命令行参数解析模块
- UIResponder详解
- c# 获取客户端ip,客户端操作系统,HttpRequest Request 详解
- 盘点那些带有OCR功能的优秀图像处理控件
- 【C++】new A和new A()的区别详解