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。那么如何来实现呢?
具体代码如下:
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优化中推荐的方式。
调用代码很简单:
我们看到,处理逻辑与事件回调方法各自处理不同的逻辑,组织得很好。同时也可以知道自己继承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灵活度很高。
运行如下:
相关文章推荐
- Android控件——ListView之Adapter提供数据(其二)
- Android控件——ListView之Adapter提供数据(其一)
- Android控件——ListView之Adapter提供数据(其三)
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- Android控件 – ListView的使用(一)– 使用Adapter绑定数据
- Android异步下载网络图片&android解析xml文件的方式&使用Adapter为ListView提供数据
- 使用Adapter为ListView提供数据(其四)
- 【Android】使用自定义Adapter优化ListView、修改数据及控件内部布局
- Android -- listview的使用, Inflater打气筒创建View对象,三种数据Adapter
- 使用Adapter为ListView提供数据(其二)
- android开发--详解ListView,动态添加,删除Adapter中的数据项
- Android_ListView_Adapter使用和数据动态加载
- Android ListView SimpleAdapter ArrayList 数据更新问题
- android 从activity用intent跳转到listactivity并在其中用simpleadapter在listview中显示数据列
- Android 自定义Adapter 但listview 只显示第一条数据
- android ListView控件操作绑定数据、单击事件
- Android_ListView_Adapter使用和数据动态加载
- 使用Adapter为ListView提供数据(其一)
- android ListView布局之二(是用simpleAdapter绑定数据)
- 一步一步学android之控件篇——ListView自定义显示数据格式