UI优化之Adapter布局复用

小随笔~

Adapter是数据源和控件的之间的桥梁,是一个非常重要的连接器,适配器。

当我们自定义adapter的时候,里面有一个最重要的方法getView。

但是,假设我们用的是listview,展示每一行数据都要调用一次getView方法,少的数据还ok,但是如果几百几万条数据,就麻烦了。

getView里面的方法无非就是两个,inflater一个布局,findViewById找到某个控件并设置数据,这两部都是IO操作,所以是很耗时的,于是我们就思考,布局能复用就好了,findViewById只要一次就好了,于是:

    public View getView(int position, View convertView, ViewGroup parent)

我们发现函数参数有个View,然后这样改造:

if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
android.R.layout.simple_list_item_1, null);
}

当View为空,创建一个,inflater一次;不为空,直接用,这样布局就可以复用了。


至于findViewById的问题,需要自己定义一个ViewHolder类,用来存放找到的控件:

class ViewHolder{
TextView textView; //根据布局存放数据的控件设置
}

然后

if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
android.R.layout.simple_list_item_1, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView)convertView.findViewById(android.R.id.text1);
convertView.setTag(viewHolder);
}else if(convertView != null){
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.textView.setText("ok");
return convertView;

核心用法是:

在convertView 为null的时候,实例化ViewHolder,并findViewById,设置找到的控件给ViewHolder,再给convertView 设置tag

第二次进来的时候再从convertView 的到ViewHolder,并给TextView设置数据,返回展示的视图

-----完-----

你可能感兴趣的:(UI优化之Adapter布局复用)