Adapter控件与其他的View控件相比,不同之处在于它们的内容通常是一个包含多项相同格式资源的列表,每次只显示其中的一项。
既然它的内容是一个列表,就不能只通过调用setText()、setBackgroundResource()等方法来设置整个列表的内容,而是需要先把这些多项要加载的内容放到一个列表,然后加载到Adapter控件中,这个控件就称为适配器。
Android中有四种Adapter对象供开发者使用
- ArrayAdapter
- SimpleAdapter
- SimpleCursorAdapter
- 自定义Adapter
适配器一般用来给ListView、Spinner、Gallery、GridView控件填充数据。
- ArrayAdapter
使用于列表中只包含文本信息的情况,填充文本信息最便捷的一种。
public class ListViewActivity extends Activity { private ListView lv; private ArrayAdapter adapter;//适配器 private String[]data = new String[] {"数据1","数据2","数据3","数据4","数据5","数据6"}; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view); lv=(ListView) findViewById(R.id.ListView_id); //创建适配器对象 adapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1,//此乃适配器自带的一种布局 data); lv.setAdapter(adapter); lv.setOnItemClickListener( new OnItemClickListener() { public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) { System.out.println("position:"+position+"---id:" +id+"---"+data[position]); } }); } }
上面代码是最简单的一种填充,如果我们填充的时候需要使用自己的布局格式的话,在创建Adapter对象的时候就需要调用另一个重载的方法:public ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
第二个参数就是自己的布局。
public class ListViewAdapter extends Activity{ private ListView lv; private ArrayAdapter adapter; private ArrayList<String> data; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_view); lv=(ListView) findViewById(R.id.ListView_id); data = new ArrayList<String>(); for (int i = 0; i < 30; i++) { data.add("第"+i+"个数据"); } adapter = new ArrayAdapter(this, R.layout.adapter, R.id.textview_id , data); lv.setAdapter(adapter); } }
用ArrayAdapter来帮助填充文本信息,大哥再也不担心一个一个setText()伤神了![]()
- SimpleAdapter
ArrayAdapter只能填充文本信息,不够炫是吧,没错,功能更加强大的SimpleAdapter来了,它可以设置图片、文本、按钮等等。
SimpleAdapter使用List<Map>形式的数据源,List每项是一个Map,Map中包含各种不同的控件资源。
public class MainActivity extends Activity { private ListView lv; private List<Map<String, Object>> data; private SimpleAdapter adapter; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.listview_id); data = new ArrayList<Map<String,Object>>(); HashMap<String, Object> map; for (int i = 0; i < 30; i++) { map = new HashMap<String, Object>(); map.put("head", "第"+i+"个数字"); map.put("img", R.drawable.ic_launcher); data.add(map); } adapter=new SimpleAdapter(this, data,//数据源 R.layout.adapter,//自定义布局 new String[]{"img","head"},//这里通过map中的key值来获取value值 new int[]{R.id.imageview_id,R.id.textview_id});//与上面的value值对应,是控件的id,一对一填充 lv.setAdapter(adapter); lv.setOnItemClickListener( new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { System.out.println("positon:"+position+"--id:"+id); } }); } }
- SimpleCursorAdapter
SimpleCursorAdapter与SimpleAdapter用法相似,只是将List<Map>对象换成了Cursor对象。
SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, c,//Cursor对象作为数据源 from,//字段名组成的数组 to);//布局中控件Id组成的数组,与上面一一对应
- 自定义Adapter
功能最强大的适配器,想要什么功能自己添加
自定义Adapter需要继承BaseAdapter,至少重写四个方法:
getCount() 获得集合大小
getItem(int position) 根据position来获取集合中的数据
getItemId(int position) 根据position获取id
getView() 重中之重 用来填充控件最重要的方法
public class MyAdapter extends BaseAdapter { //先要有数据源 list中为一个QQ对象 private List<QQ> list; private Context context; //构造函数 public MyAdapter(Context context, List<QQ> list){ this.context = context; this.list = list; } public int getCount() { return list.size(); } public Object getItem(int position) { return list.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { //使用缓存技术来增加效率 通过自定义内部类ViewHolder ViewHolder holder = null; if(convertView == null){ convertView = LayoutInflater.from(context).inflate(R.layout.myadapter,//所要填充的布局 null);//权限 holder = new ViewHolder(); holder.head = (ImageView) convertView.findViewById(R.id.head_id); holder.talk = (TextView) convertView.findViewById(R.id.userTalk_id); holder.username = (TextView) convertView.findViewById(R.id.userName_id); convertView.setTag(holder);//放入缓存 }else {//如果converView不为空,就不用重新获取了,直接从缓存中获得各个控件即可 holder = (ViewHolder) convertView.getTag();//取出缓存 } holder.head.setImageResource(list.get(position).getImageId()); holder.talk.setText(list.get(position).getTalk()); holder.username.setText(list.get(position).getUserName()); return convertView; } public class ViewHolder{ private ImageView head; private TextView username, talk; } }
QQ类:public class QQ { private int imageId; private String userName; private String talk; public int getImageId() { return imageId; } public void setImageId(int imageId) { this.imageId = imageId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getTalk() { return talk; } public void setTalk(String talk) { this.talk = talk; } }