zoukankan      html  css  js  c++  java
  • Android——ViewHolder的作用与用法

    转载至:https://www.cnblogs.com/wugu-ren/p/6106379.html

    ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
    android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建。
    ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}
    方法中进行的(要自定义listview都需要重写listadapter:如BaseAdapter,SimpleAdapter,CursorAdapter的等的getvView方法),优化listview的加载速度就要让convertView匹配列表类型,并最大程度上的重新使用convertView。

    getview的加载方法一般有以下三种种方式:
    最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据
     1 public View getView(int position, View convertView, ViewGroup parent) 
     2 {
     3  View item = mInflater.inflate(R.layout.list_item_icon_text, 
     4 null);
     5  ((TextView) 
     6 item.findViewById(R.id.text)).setText(DATA[position]);
     7  ((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
     8  (position & 1) == 1 ? mIcon1 : mIcon2);
     9  return item;
    10 }

    正确的加载方式是当convertView不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据

     1 public View getView(int position, View convertView, ViewGroup parent) 
     2 {
     3    if (convertView == null) {
     4        convertView = mInflater.inflate(R.layout.item, parent, false);
     5    }
     6  ((TextView) 
     7 convertView.findViewById(R.id.text)).setText(DATA[position]);
     8  ((ImageView) 
     9 convertView.findViewById(R.id.icon)).setImageBitmap(
    10  (position & 1) == 1 ? mIcon1 : mIcon2);
    11  return convertView;
    12  }

     最快的方式是定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可

     1 static class ViewHolder {
     2 TextView text;
     3 ImageView icon;
     4 }
     5 public View getView(int position, View convertView, ViewGroup parent) 
     6 {
     7  ViewHolder holder;
     8  if (convertView == null) {
     9  convertView = mInflater.inflate(R.layout.list_item_icon_text,
    10  parent, false);
    11  holder = new ViewHolder();
    12  holder.text = (TextView) convertView.findViewById(R.id.text);
    13  holder.icon = (ImageView) convertView.findViewById(R.id.icon);
    14  convertView.setTag(holder);
    15 } else {
    16 holder = (ViewHolder) convertView.getTag();
    17 }
    18 holder.text.setText(DATA[position]);
    19 holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : 
    20 mIcon2);
    21 return convertView;
    22 }
  • 相关阅读:
    洛谷—— P2234 [HNOI2002]营业额统计
    BZOJ——3555: [Ctsc2014]企鹅QQ
    CodeVs——T 4919 线段树练习4
    python(35)- 异常处理
    August 29th 2016 Week 36th Monday
    August 28th 2016 Week 36th Sunday
    August 27th 2016 Week 35th Saturday
    August 26th 2016 Week 35th Friday
    August 25th 2016 Week 35th Thursday
    August 24th 2016 Week 35th Wednesday
  • 原文地址:https://www.cnblogs.com/mxj961116/p/10445094.html
Copyright © 2011-2022 走看看