您的位置:首页 > 其它

关于listview的优化

2014-04-15 20:42 309 查看
listview是我们在android项目中,使用最为频繁的控件之一,我们常常使用listview作为我们加载和显示我们的数据的容器。因为每个listview 我们需要显示的内容和条目往往比较多,所以使用listview的时候,为了提高应用的性能和减少内存的使用,有经验的朋友进常会使用

1.convertView 来循环利用我们的item对象

2.使用ViewHolder 来获取item对象中 不同的view对象(每个item都有自己的view 层次,如果想要直接从view布局层次中获取我们特点的view,必须通过findViewById(),这个做法将会遍历我们的view 树,从而影响性能)

对于循环利用我们的item对象,我们需要认真的看看下面这幅图(图片来自网络):


我们,首先引入一个简单的代码,

public View getView(int position, View convertView, ViewGroup parent) {
  ViewHolder holder;
  if (convertView == null) {
    convertView = LinearLayout.inflate(R.layout.list_item_icon_text, null);
    holder = new ViewHolder();
    holder.text = (TextView) convertView.findViewById(R.id.text);
    holder.icon = (ImageView) convertView.findViewById(R.id.icon);
    convertView.setTag(holder);
  } else {
    holder = (ViewHolder) convertView.getTag();
  }

  holder.text.setText(DATA[position]);
  holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

  return convertView;
}

static class ViewHolder {
  TextView text;
  ImageView icon;
}
那么什么时候我们可以循环使用convertView呢? 从上面这个代码片段中,我们知道 当系统告诉我们convertView 不为空的时候 我们就可以直接使用convertView 不需要做inflate这个比较影响性能的操作,那么系统在什么时候会给我们不为空的convertView,从上面的图中 ,我们可以看到每个listview 填充item的时候,一开始会按照屏幕和item的大小,填充对于数目的item到listview中,这个过程中没有convertview可以循环使用,一旦填满了以后,当我们向上滑动,那么第一个item滑出listview的可视范围,则会被系统回收,与此同时,回收的item可以循环给下一个item使用(也就是listview底部的item)。看到这里,我们一下豁然开朗。

然而,有些人可能会有疑问,对于拥有多种不同item布局的listview 总不能是上面滑出去的item跟下面想要滑进来的item是一样的布局吧。 有这个疑问的同学,请再看看我们的图,在图中回收区我们有type 1,type2,...type n。 这也就表明了,其下方滑进了来的item 不是说直接把 上方的item拿来用。

我们看看官方Adapter中另外的两个重要的函数public abstract int getViewTypeCount ()和public
abstract int getItemViewType (int
position)


public abstract int getViewTypeCount ()

Returns the number of types of Views that will be created
by
getView(int,
View, ViewGroup)
. Each type represents a set of views that can be converted in
getView(int,
View, ViewGroup)
. If the adapter always returns the same type of View for all items, this method should return
1

这个函数告诉系统 我们的listView有多少中不同的item,一般情况下,我们不需要使用这个函数 除非我们有多种item需要显示。系统默认返回1


public abstract int getItemViewType (int position)

Added in API level 1

Get the type of View that will be created by
getView(int,
View, ViewGroup)
for the specified item.

Parameters
positionThe position of the item within the adapter's data set whose view type we want.
Returns

An integer representing the type of View. Two views should share the same type if one can be converted to the other in
getView(int,
View, ViewGroup)
. Note: Integers must be in the range 0 to
getViewTypeCount()
-
1.
IGNORE_ITEM_VIEW_TYPE
can
also be returned.

这个函数,可以告诉我们当前需要加载的是哪种类型,他会去我们的回收区中,获取对应类型的item交给我们的getView函数,如果获取不到,那么传递給getView的就是null,也就是告诉我们的getView()应该自己去实例化我们的item对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: