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 * 16 * @return 17 */ 18 @Override 19 public int getCount() 20 { 21 return list.size(); 22 } 23 24 /** 25 * 返回条目(list中存储的某一条对象数据) 26 * 固定写法 27 * 28 * @param position //position n 位置 29 * @return 30 */ 31 @Override 32 public Object getItem(int position) 33 { 34 return list.get(position); 35 } 36 37 /** 38 * 返回条目id(list中存储的某一条对象数据在list中的位置) 39 * 固定写法 40 * 41 * @param position 42 * @return 43 */ 44 @Override 45 public long getItemId(int position) 46 { 47 return position; 48 } 49 50 /** 51 * 自定义ViewHolder内部类 为了减少findviewbyid的次数,封装控件的引用 52 */ 53 private class ViewHolder 54 { 55 private TextView tv_name, tv_age; 56 private Button btn; 57 } 58 59 /** 60 * 返回显示数据集中指定位置数据项的View 对象 61 * 62 * @param position 63 * @param convertView //旧的View重用 convert vt. 使转变;转换…;使…改变信仰 64 * @param parent 65 * @return 66 */ 67 @Override 68 public View getView(final int position, View convertView, ViewGroup parent) 69 { 70 ViewHolder viewHolder = null;//申明viewHolder对象 71 if (convertView == null)//第一次进入 convertView复用组件为空,view无复用时 72 { 73 viewHolder = new ViewHolder();//创建viewHolder对象 74 // 75 //相当于自建组件view,填充给convertView 76 //static View inflate(Context context, @LayoutRes int resource, ViewGroup root) 77 // 78 convertView = View.inflate(context, R.layout.item_baseadapter, null);//inflate vt. 使充气;使通货膨胀 79 //给viewHolder里的组件赋值 80 //布局文件填充给了convertView,所以在convertView里面findViewById() 81 viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name); 82 viewHolder.tv_age = (TextView) convertView.findViewById(R.id.tv_age); 83 viewHolder.btn = (Button) convertView.findViewById(R.id.btn); 84 viewHolder.btn.setFocusable(false);//使btn失去焦点 85 86 //保存viewHolder, tag n 标签 87 convertView.setTag(viewHolder); 88 } else//convertView复用组件不为空, view复用时 89 { 90 //取出前面保存的viewHolder 91 viewHolder = (ViewHolder) convertView.getTag(); 92 } 93 94 viewHolder.btn.setOnClickListener(new View.OnClickListener() 95 { 96 @Override 97 public void onClick(View v) 98 { 99 TextView textView = (TextView) ((MainActivity) context).findViewById(R.id.tv); 100 textView.setText("按钮详情: 第 " + 101 (position + 1) + "条 " + ((Person)getItem(position)).toString()); 102 } 103 }); 104 105 //获取数据集中指定位置数据项的person对象,并将值放入viewHolder对应的组件中 106 Person person = (Person) getItem(position); 107 Log.e("getView()当前条目为:", person.toString()); 108 viewHolder.tv_name.setText(person.getName()); 109 viewHolder.tv_age.setText(person.getAge() + ""); 110 111 return convertView; 112 } 113 }