首页 > 试题广场 >

以下代码为适用于ListView的Adapter的部分代码,

[问答题]

以下代码为适用于ListView的Adapter的部分代码,请根据代码解释下

1)getView方法中对convertView是否为空做了不同处理,目的是什么?

2)viewholder有什么作用?

 

private List<String> mData = new ArrayList<>();

 

private static class ViewHolder {

   TextView text;

  

   public ViewHolder(View rootView) {

       text = (TextView)rootView.findViewById(R.id.text);

   }

  

   public void bind(String item) {

       ...

   }

}

 

@Override

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

   String item = mData.get(position);

   ViewHolder viewHolder;

   if (null == convertView) {

       convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, parent, false);

       viewHolder = new ViewHolder(convertView);

       convertView.setTag(viewHolder);

   } else {

       viewHolder = (ViewHolder) convertView.getTag();

   }

   viewHolder.bind(item);

   return convertView;

}

1.主要是看缓存对象是否为null,如果为null那么我们就要创建一个item对象,同时listview是一个下滑控件,listview是由多个item组成的,如果上面的item对象不可见了,那么这个item 的view对象就会缓存起来,成为这个convertView对象我们可以复用这个缓存对象,让其不必再次的创建,这样可以省出很多时间。
2.当我们在第一次根据一个布局文件创建一个view的item对象的时候,我们就要把它的孩子或者说子空间通过findViewById的方式找出来,把它存入这个ViewHolder(相当于记事本)中去,或者说在记事本中记录子孩子,再把这个ViewHolder放进父亲的口袋中去,这样当我们复用缓存对象的时候,我们直接不用findViewById的方式去寻找子孩子,而是从父亲的手中拿出记事本来查找这个子孩子对象,这样我们再复用父亲的同时也复用了孩子。提高了效率大概在5%左右。

发表于 2018-08-12 22:35:53 回复(0)