在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局。
需要配合适配器使用,选用适配器时,可以选用arrayAdapter,SimpleAdapter等,最常用baseAdapter.
在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作。也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点。读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖。这时候最方便的方法就是使用灵活的适配器BaseAdapter了。
自定义adapter继承baseAdapter, 一般情况下步骤:
1.构造方法,用于传递context,数据源
2.public int getCount() //获得展示数据条数
3.public Object getItem(int position) //获取第position个item的内容
4.public long getItemId(int position)//获得当前item在第几行
5.public View getView(int position, View convertView, ViewGroup parent)
getView通常最优化方案使用viewHolder+convertView使用
ViewHolder:通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能。
类似于模具,将得到的view存到缓冲view(设置标签),下次通过标签获取继续使用,不需要重复创建对象和findviewByID,占用系统资源。
convertView:重用缓存convertView传递给getView()方法来避免填充不必要的视图。
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
//如此写会造成重复的构建textview,严重占用资源
// resource:layout 布局文件
// root:当前item的view在哪个ViewGroup中 一般返回parent
// attachToRoot:需要再次将view贴在ViewGroup中吗?
//convertView:之前是否有这个view,缓存的view
/*View view=LayoutInflater.from(context).inflate(R.layout.base_adapter, parent, false);
TextView mTextView=(TextView) view.findViewById(R.id.txt_newsItem);
mTextView.setText(dataList.get(position));*/
//优化方案
ViewHolder mHolder = null;
if (convertView == null) {
mHolder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.base_adapter, null);
mHolder.textView = (TextView) convertView.findViewById(R.id.txt_newsItem);
//将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
convertView.setTag(mHolder);
} else {
mHolder = (ViewHolder) convertView.getTag();
}
mHolder.textView.setText(dataList.get(position));
return convertView;
}
class ViewHolder {
TextView textView;
}
模具里加入需要显示的控件如textview.imageview等,然后将模具加载到convertView上, 也就是每一条item
当我们判断 convertView == null 的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,绑定convertView,以便系统第二次绘制ListView时从Tag中取出。
如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。