使用Adapter为ListView提供数据(其四)

前面几章节所讲的SimpleAdapter、CursorSimpleAdapter,ArrayAdapter都是继承自BaseAdapter的,他们都有各自的使用特点,如下:

ArrayAdapter               适用于数据源通常是Sring[] 或者是List<String>

SimpleAdapter             适用于数据源通常是List<? extends Map<String, ?>>

CursorSimpleAdapter   适用于数据源通常是Cursor

 但是他们都有各自的适用范围,有些时候我们必须自定义一个Adapter类,继承之BaseAdpater。那么如何来实现呢?

具体代码如下:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
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优化中推荐的方式。

调用代码很简单:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   

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灵活度很高。

运行如下:


   2011041523091436.jpg

转载于:https://www.cnblogs.com/zhangdongzi/archive/2011/04/15/2017620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值