Android 自定义适配器逐步优化
来源:互联网 发布:mac 修复flash 插件 编辑:程序博客网 时间:2024/04/29 19:26
// 很多人在使用自定义适配器的时候存在执行效率低,内存消耗大,代码
// 不够优化的问题,下面列出Android 几种自定义适配器的写法
第一种方式没有实现布局对象的复用,使用自定义适配器中上下文与资源id参数获取” 自定义布局对象 ” ,获取到自定义布局对象之后,便可以根据,控件Id找到各个控件,返回值为你自定义对象的一个界面,容器中需要多项,自定义布局的界面来填充
/*
//第一种方式:没有实现布局对象的复用
// TODO 生成显示数据项的布局对象
//根据布局的xml文件生成布局对象
//得到LayoutInflater对象
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
//LayoutInflater对象可以根据布局的xml文件生成布局对象
//第二个参数必须是null,因为如果不是null,会去调用ListView的addView()方法,而ListView没有这个方法
View view = inflater.inflate(resourceId, null);
//System.out.println(“=====”+view);
//convertView接收的是可复用的布局对象,当没有可复用的布局对象时,接收的是null
//System.out.println(“=====”+convertView);
//把要显示的数据放到布局对象中的TextView上,得到TextView对象
//从整体的布局对象中获取TextView对象
TextView textView = (TextView) view.findViewById(R.id.textView);
//给textView的text属性设置为当前显示的数据项
textView.setText(datas.get(position).toString());
return view;
/方式二:利用convertView 实现了 布局对象的复用,一个布局对象,就是容器中显示的一个条目,由于手机屏幕大小优先,当之前的布局项滑出屏幕时,
之后的,条目复用之前滑出屏幕的条目
//convertView接收的是可复用的布局对象,当没有可复用的布局对象时,接收的是null //先判断是否有可复用的 /*if(convertView==null){ // 一条一条 从convertView 中去拿 //convertView = LayoutInflater.from(context).inflate(resourceId, null); convertView = LayoutInflater.from(context).inflate(resourceId, parent, false); } //得到布局对象中的TextView对象 //每次都要findViewById,影响程序性能 TextView tv = (TextView) convertView.findViewById(R.id.textView); tv.setText(datas.get(position).toString()); return convertView;*/ //第三种方式:减少findViewById执行的次数
在执行过一次findViewById 之后,自定义布局内,控件的id值存入
ViewHolder的全局变量中,下次赋值的时候 ,直接从类中出即可
ViewHolder holder = null; if(convertView ==null){ convertView = LayoutInflater.from(context).inflate(resourceId, parent, false); holder = new ViewHolder(); //让holder中的textView成员指向布局对象中的TextView对象 holder.textView = (TextView) convertView.findViewById(R.id.textView); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag();//当可复用时,直接获取holder } //操作holder中的textView就是操作布局对象中的TextView对象 holder.textView.setText(datas.get(position).toString()); return convertView;}//通过ViewHolder减少findViewById方法执行的次数class ViewHolder{ TextView textView;}
// 方式 自定义布局中控件 过多,findViewById 会显得代码不好看
此时我们可以在 ViewHolder中加入一个成员变量,并提供一个getViewById(int ResourceId) 的方法,将convertView的值通过构造方法传入,方法返回控件对象
package com.example.gp11_day10_listview6_cbk1.adapter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.gp11_day10_listview6_cbk1.R;
import com.example.gp11_day10_listview6_cbk1.asynctask.DownTask;
import com.example.gp11_day10_listview6_cbk1.entity.CbkData;
import android.content.Context;
import android.graphics.Bitmap;
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 abstract class CbkDataAdapter extends BaseAdapter {
private Context context;private List<CbkData> datas;public CbkDataAdapter(Context context, List<CbkData> datas) { super(); this.context = context; this.datas = datas;}@Overridepublic int getCount() { int count = 0; if(datas!=null) count = datas.size(); return count;}@Overridepublic Object getItem(int position) { return datas.get(position);}@Overridepublic long getItemId(int position) { return position;}@Overridepublic View getView(int position, View convertView, final ViewGroup parent) { ViewHolder holder =null; if(convertView==null){ convertView = LayoutInflater.from(context).inflate(R.layout.item_cbk, parent, false); holder = new ViewHolder(convertView); convertView.setTag(holder); } else holder = (ViewHolder) convertView.getTag(); //显示数据 showDatas(holder,datas.get(position)); return convertView;}public abstract void showDatas(ViewHolder holder,CbkData data);public class ViewHolder{ private Map<Integer,View> views;//存放布局对象中的视图对象 private View itemView;//布局对象 public ViewHolder(View itemView) { this.itemView = itemView; views = new HashMap<Integer,View>(); } //根据视图的id得到视图对象 public View getView(int id) { View view = views.get(id); if(view==null) { view = itemView.findViewById(id); views.put(id, view); } return view; }}
}
- Android 自定义适配器逐步优化
- Android学习笔记-自定义适配器及优化
- Android自定义适配器 (BaseAdapter)及优化
- ListView自定义适配器 优化
- 自定义Listview适配器的优化
- android适配器的优化
- Android Adapter(适配器)优化
- android适配器优化封装
- android优化适配器集合
- Android基础-自定义适配器
- Android自定义适配器BaseAdapter
- Android自定义Adapter适配器
- Android自定义适配器
- android 自定义适配器BaseAdapter
- Android 自定义适配器
- Android:自定义适配器
- Android之自定义适配器
- Android笔记-自定义适配器
- 实现水波效果
- “老子化胡”和白马寺焚经
- Java堆内存
- win7下Trim启用的验证方法
- Daivik VM 和 JVM 的比较
- Android 自定义适配器逐步优化
- 8088/8086的内部结构
- ZOJ3607 2012浙江省省赛 贪心吧
- 三大算法总结
- 安装mysql5.5 解压
- <考古笔记>hge游戏引擎(一)Tutorials
- Objective-c 内存管理方式
- Constructing Roads In JGShining's Kingdom
- HDU 3062 Party(2-SAT简单题)