引言:
android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时我们需要在getView()方法中使用convertView和ViewHolder类来解决,它们的工作原理分别如下:
1)convertView---------->ListView的一级优化.
工作原理:
Android程序渲染ListView遵循以下原则:
无论item项多少,只渲染当前屏的item项,被渲染过的item项,它的视图对象会被保存到Recycler(反复循环器)中.新滑入的item项将从recycler中来获取缓存视图,而不是在通过inflate方法反射获取,从而有效避免了反射方法的耗时.
Recycler中只需要缓存N+1个视图对象,即可保证整个ListView的显示(N为一层可显示的item数).这样无论item项有多少,inflate方法最多调用N+1次.
2)ViewHolder----------->ListView的二级优化.
工作原理:
ViewHolder是一个类,它储存了通过findviewById获取来的控件对象,当convertView被新建时,ViewHolder也随之一起缓存到recycler中,当convertView被重新利用时,ViewHolder也随之取出,从而可以直接给各个控件赋值,而无需再次调用findviewById方法.
Java代码中实现如下:
@Override public View getView(final int position, View convertView, ViewGroup parent) { //1.申明ViewHolder ViewHolder holder = null; //2. convertView进行非空判断 if (convertView == null) { //用布局填充气泵 把layout转化程View convertView = LayoutInflater.from(context).inflate(R.layout.item, parent,false); //ViewHolder赋值 holder = new ViewHolder(); //把ConverView中的控件赋给holder对象的属性 holder.button = (Button) convertView.findViewById(R.id.button); holder.textView = (TextView) convertView.findViewById(R.id.tv_02); //把holder类作为tag赋值 convertView.setTag(holder); }else { holder = (ViewHolder) convertView.getTag(); } //给控件进行赋值 Map<String, String> map = data.get(position); holder.button.setText(map.get("button")); holder.textView.setText(map.get("textView")); holder.button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, "您点击了我"+position, Toast.LENGTH_SHORT).show(); } }); //千万不要忘了 把convertView返回 return convertView; } class ViewHolder{ //有哪些控件,根据单条布局来定 //Button TextView Button button; TextView textView; }