您的位置:首页 > 移动开发 > Android开发

Android控件——ListView之Adapter提供数据(其四)

2014-05-26 00:00 369 查看
前面几章节所讲的SimpleAdapter、CursorSimpleAdapter,ArrayAdapter都是继承自BaseAdapter的,他们都有各自的使用特点,如下:
ArrayAdapter 适用于数据源通常是Sring[] 或者是List<String>
SimpleAdapter 适用于数据源通常是List<? extends Map<String, ?>>
CursorSimpleAdapter 适用于数据源通常是Cursor
但是他们都有各自的适用范围,有些时候我们必须自定义一个Adapter类,继承之BaseAdpater。那么如何来实现呢?
具体代码如下:





public

class
MyBaseAdapter
extends
BaseAdapter {

List
<
River
>
rivers
=
null
;
Context context
=
null
;

public
MyBaseAdapter(Context context,List
<
River
>
rivers){

this
.context
=
context;

this
.rivers
=
rivers;
}

@Override

public

int
getCount() {

return
rivers.size();
}

@Override

public
Object getItem(
int
position) {

return

null
;
}

@Override

public

long
getItemId(
int
position) {

return

0
;
}

/**
***优化建议主要是缓存组件,速度非常快***
*/

@Override

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

if
(convertView
==
null
){

final
LayoutInflater inflator
=
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView
=
inflator.inflate(R.layout.image,
null
);
holder
=
new
ViewHolder();
holder.txtName
=
(TextView)convertView.findViewById(R.id.txtName);
holder.txtLength
=
(TextView)convertView.findViewById(R.id.txtLength);
convertView.setTag(holder);
}
else
{
holder
=
(ViewHolder)convertView.getTag();
}
River river
=
rivers.get(position);
holder.txtName.setText(river.getName());
holder.txtLength.setText(String.valueOf(river.getLength()));

return
convertView;
}

static

class
ViewHolder {
TextView txtName;
TextView txtLength;
}
}




listView开始绘制的时候,系统首先调用getCount方法,得到listView的长度。然后根据这个长度,调用getView方法绘制每一行。
在这里我们定义一个内部类ViewHolder,用来保存我们需要缓存的组件,目的是为了使得ListView显示不卡。
当然我们还必须实现其他的一些方法,通常我们需要显示多少条数据,就需要覆盖getCount方法,并设置输出多少条数据。而在
public View getView(int position, View convertView, ViewGroup parent) 方法中我们需要获得系统的布局服务,以便解析特定的布局,如下:
final LayoutInflater inflator=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
然后找到所需的布局ID,并把放置到ViewHolder中,同时缓存在convertView的Tag中,以便系统第二次绘制ListView项时,从Tag中取出。这种做法是google/IO优化中推荐的方式。
调用代码很简单:





List
<
River
>
rivers
=
new
ArrayList
<
River
>
();

for
(
int
i
=
0
;i
<
4
;i
++
){
River river
=
new
River();
river.setName(
"
胶莱运河
"
);
river.setLength(
300
);
rivers.add(river);
}
MyBaseAdapter baseadapter
=
new
MyBaseAdapter(
this
,rivers);
listView.setAdapter(baseadapter);




我们看到,处理逻辑与事件回调方法各自处理不同的逻辑,组织得很好。同时也可以知道自己继承BaseAdapter灵活度很高。
运行如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: