原理:创建一个容器装要复用的View,设置判断,达到减少findViewById的次数的效果
MainActivity如下,这个比较简单就不解释了
主要讲下适配器:
继承BaseAdapter后实现四个方法
具体解释如下图(两图是一起的,最后会放源码)
上图所示:在getview方法中有三个参数,起到优化的部分为ViewHolder的使用,主要方法setTag(),getTag()。
适配器代码如下:
public class Myadapter extends BaseAdapter {
List<String> date;
Context context;
//构造方法
public Myadapter(List<String> date, Context context) {
this.date = date;
this.context = context;
}
//获取ListView的总条目数
@Override
public int getCount() {
return date.size();
}
//条目的索引
@Override
public Object getItem(int position) {
return date.get(position);
}
//获取条目的位置
@Override
public long getItemId(int position) {
return position;
}
/*
* 渲染(填充),调用data.size次
* position 索引
* convertView 条目的View
* parent :Listview
* */
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
//当convertView首次加载的时候
if (convertView == null) {
//获取打气筒
LayoutInflater inflater = LayoutInflater.from(context);
//填充单个Item
convertView = inflater.inflate(R.layout.item_main, null);
//获取Viewholder对象,减少findViewById的次数
holder = new ViewHolder();
//从填充的条目View中找到我们所关心的控件
holder.textView = convertView.findViewById(R.id.tv_my);
//将holder装进convertView的口袋
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//填充数据
holder.textView.setText(date.get(position));
return convertView;
}
//创建一个容器装要复用的View
static class ViewHolder {
TextView textView;
}
}