这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多。所以学习了关于listview的优化,并且这也是普遍使用的方法。我们一般来说创建listview的话更常用的是继承BaseAdapter的方式进行实现,因为这样可以自定义list没一个item的布局,根据程序的需求进行定制,一般来说listview所展示的数据都是比较多的,一般也有比较少的。所以,不对adapter进行优化的话,那么每一次拖动listview都需要生成一次布局,这样的话,程序就可能会有卡顿的情况,并且这样的方式占用内存也比较多。主要是 getView(final int position, View convertView, ViewGroup parent){}的区别
下面这种方式不推荐使用:
public View getView(final int position, View convertView, ViewGroup parent) { convertView= inflater.inflate(R.layout.activity_layout, null); TextView testName = (TextView) convertView .findViewById(R.id.testName_textview); TextView CassetteType = (TextView) convertView .findViewById(R.id.CassetteType_textview); TextView testTimeYear_textview = (TextView) convertView .findViewById(R.id.testTimeYear_textview); testName.setText("Hello"); CassetteType.setText("Android"); testTimeYear_textview.setText("Word"); return view; }
比较简单的例子,上面的方式不推荐使用,因为每一次加载item的时候都需要重新加载每一个控件,使得程序占用内存大,还可能会卡卡的感觉。
推荐下面的方式使用:
public View getView(final int position, View convertView,ViewGroup parent) { ViewHolder viewHolder = null; if (null == convertView) { viewHolder = new ViewHolder(); LayoutInflater mInflater = LayoutInflater.from(mContext); convertView = mInflater.inflate(R.layout.data_management, null); viewHolder.CassetteType = (TextView) convertView .findViewById(R.id.CassetteType_textview); viewHolder.testTimeYear_textview = (TextView) convertView .findViewById(R.id.testTimeYear_textview); viewHolder.testTime = (TextView) convertView .findViewById(R.id.testTime_textview); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } testName.setText("Hello"); CassetteType.setText("Android"); testTimeYear_textview.setText("Word"); return convertView; } private static class ViewHolder { TextView CassetteType; TextView testTimeYear_textview; TextView testTime; }
这种方法的特点便是通过类ViewHolder,进行TextView的定义,Adapter每一次创建一个item的时候先判断convertView是否为空,为空的话就进行findViewById,其中最重要的是这个convertView.setTag(viewHolder);,convertView不为空的话就执行这句viewHolder = (ViewHolder) convertView.getTag();,然后每一个item就不需要重复性的去findViewById布局的每一个view了,这样就能优化listview的加载速度和减少内存使用,原理大概便是这样,可能也没有讲明,没能理解的话,建议搜搜listview优化。