Adapter 是数据源与UI组件之间的纽带
Adapter:四种:
ArrayAdapter:只能显示一行文字 操作简单
SimpleAdapter:支持自定义布局
SimpleCursorAdapter:处理Cursor中的数据
BaseAdapter:支持更复杂的布局
需要自行提供列表布局文件,还需自行编写适配器类
ArrayAdapter、SimpleAdapter、SimpleCursorAdapter都是 BaseAdapter的子类
SimpleCursorAdapter不是SimpleAdapter的子类!
BaseAdapter :常用于被继承
四个要实现的方法:
public int getCount() ------返回List的条目数,一般为数据源的大小
public Object getItem(int position) ------获取数据集中指定位置的数据项
public long getItemId(int position) ----获取数据集中指定位置数据项的id
public View getView(int position, View convertView, ViewGroup parent) ----获取显示数据集中指定位置数据项的View 对象。
View对象的获取方法:View.inflate(con,R.layout.XXX,null);-----将一个布局文件渲染成一个View对象
convertView 缓存。当首次加载Item的时候将布局文件渲染到缓存中如果缓存文件不为空,那么通过缓存文件来获取内部组件并修改其内容。
焦点的问题:当ListView中有Button,Checkbox,EditText的时候,以上控件会占有焦点,导致listView的Item点击失效,
解决办法:在布局文件中加属性使其失去焦点。
android:focusable="false" //focus n. 焦点;中心;清晰;焦距
android:focusableInTouchMode="false"
案例代码:
在package com.example.administrator.baseadapterdemo.custom 中
创建MyAdapter extends BaseAdapter
1 public class MyAdapter extends BaseAdapter 2 { 3 private Context context;//用于接收传递过来的Context对象 4 private List list;//用于接收传递过来的数据集合 5 6 public MyAdapter(Context context, List list) 7 { 8 this.context = context; 9 this.list = list; 10 } 11 12 /** 13 * 获取list(listview)的条目的数量 14 * 固定写法 15 * @return 16 */ 17 @Override 18 public int getCount() 19 { 20 return list.size(); 21 } 22 23 /** 24 * 返回条目(list中存储的某一条对象数据) 25 * 固定写法 26 * @param position //position n 位置 27 * @return 28 */ 29 @Override 30 public Object getItem(int position) 31 { 32 return list.get(position); 33 } 34 35 /** 36 * 返回条目id(list中存储的某一条对象数据在list中的位置) 37 * 固定写法 38 * @param position 39 * @return 40 */ 41 @Override 42 public long getItemId(int position) 43 { 44 return position; 45 } 46 47 /** 48 * 自定义ViewHolder内部类 为了减少findviewbyid的次数,封装控件的引用 49 */ 50 private class ViewHolder 51 { 52 private TextView tv_name, tv_age; 53 } 54 55 /** 56 * 返回显示数据集中指定位置数据项的View 对象 57 * @param position 58 * @param convertView //旧的View重用 convert vt. 使转变;转换…;使…改变信仰 59 * @param parent 60 * @return 61 */ 62 @Override 63 public View getView(int position, View convertView, ViewGroup parent) 64 { 65 ViewHolder viewHolder = null;//申明viewHolder对象 66 if (convertView == null)//第一次进入 convertView复用组件为空,view无复用时 67 { 68 viewHolder = new ViewHolder();//创建viewHolder对象 69 // 70 //相当于自建组件view,填充给convertView 71 //static View inflate(Context context, @LayoutRes int resource, ViewGroup root) 72 // 73 convertView = View.inflate(context, R.layout.item_baseadapter, null);//inflate vt. 使充气;使通货膨胀 74 //给viewHolder里的组件赋值 75 viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); 76 viewHolder.tv_age = (TextView) convertView.findViewById(R.id.tv_age); 77 //保存viewHolder, tag n 标签 78 convertView.setTag(viewHolder); 79 } else//convertView复用组件不为空, view复用时 80 { 81 //取出前面保存的viewHolder 82 viewHolder = (ViewHolder) convertView.getTag(); 83 } 84 85 //获取数据集中指定位置数据项的person对象,并将值放入viewHolder对应的组件中 86 Person person = (Person) getItem(position); 87 Log.e("getView()当前条目为:", person.toString()); 88 viewHolder.tv_name.setText(person.getName()); 89 viewHolder.tv_age.setText(person.getAge() + ""); 90 91 return convertView; 92 } 93 }
原文:http://www.cnblogs.com/starman/p/5024065.html