初次接触Android里的holder类时,并不是很能理解holder类的使用,只知道它能够使ListView控件在滑动时不会再重复创建Item对象,从而实现减少内存消耗和减少对屏幕的渲染处理。当我们自定义适配器继承BaseAdapter的时候,会要求实现BaseAdapter中的4个抽象方法(getCount、getItem、getItemId、getView),其中getView方法里有3个参数(position、convertView、parent),那我的理解就是将convertView看成缓存对象,第一次加载时,并没有缓存对象,所以需要不断创建item对象,等创建达到一个限制时停止创建,并不断复用缓存对象容器,从而在这里实现减少内存消耗的功能。
item对象第一次创建后才能变成缓存对象,等到item对象创建达到一个小的限制值时,缓存对象才算全部完成创建,之后就会一直复用缓存对象容器
那Holder在其中的作用是什么呢?我想Holder就是把初次创建item对象里的控件进行一个初始化并用holder进行封装,将holder放到缓存对象手中等待添加数据。
@Override
//将convertView看成缓存对象,假设缓存对象只能同时提几个“袋子”
public View getView(int i, View convertView, ViewGroup viewGroup) {
MyHolder myholder = null;
// 第一次加载时 缓存对象手上没有“袋子”
if (convertView == null){
// 1.布局转控件--->为的就是将布局变成一个一个的控件
convertView = View.inflate(Main2Activity.this,R.layout.layout_item,null);
// 2.获取到layout_item里的控件,将这些控件封装放到myholder“袋子”中
myholder = new MyHolder(convertView);
// 3.将“袋子”放到缓存对象手中,等待向这个“空袋子”里添加数据
convertView.setTag(myholder);
}else{
// 如果缓存对象手里有“空袋子”(相当于已经划出屏幕的对象),直接等待向“空袋子”添加数据
// 通过不断复用已经清空的“袋子”来实现减少内存
myholder = (MyHolder) convertView.getTag();
}
//向“袋子”里放数据的过程
myholder.tv_price.setText(cargos[i].goodsPrice);
myholder.tv_title.setText(cargos[i].goodsTitle);
myholder.iv_icon.setBackgroundResource(cargos[i].goodsIcon);
return convertView;
}
class MyHolder{
TextView tv_title,tv_price;
ImageView iv_icon;
public MyHolder(View v) {
tv_title = v.findViewById(R.id.good_title);
tv_price = v.findViewById(R.id.good_price);
iv_icon = v.findViewById(R.id.good_image);
}
}
如果读者觉得有更好的理解方式,或者认为我的理解错误,欢迎您来评论区进行交流,非常期待从您的评论获取到更加新颖的思考!