ListView的三种适配器
1、ArrayAdapter:只可以简单的显示一行文本
2、SimapleAdapter:simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片)等。可以显示比较复杂的列表,包括每行显示图片、文字等,但不能对列表进行后期加工(在java代码中加工).使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局imagelayout.xml
第一个参数 表示访问整个android应用程序接口,基本上所有的组件都需要
第二个参数表示生成一个Map(String ,Object)列表选项
第三个参数表示界面布局的id 表示该文件作为列表项的组件
第四个参数表示该Map对象的哪些key对应value来生成列表项
第五个参数表示来填充的组件 Map对象key对应的资源一依次填充组件 顺序有对应关系
SimpleAdapter adpter=new SimpleAdapter(this,getData(),R.layout.imagelayout,new String[]{"title","info","img"},new int[]{R.id.title,R.id.info,R.id.img})private List<Map<String, Object>> getData() {
List<Map<String, Object>> mList = new ArrayList<Map<String, Object>>(); Map<String, Object> map = new HashMap<String, Object>(); map.put("title", "tp"); map.put("info", "fb"); map.put("img", R.drawable.icon); mList.add(map); map = new HashMap<String, Object>(); map.put("title", "tp2"); map.put("info", "fb2"); map.put("img", R.drawable.icon2); mList.add(map); return mList;
}
3、BaseAdapter:实现复杂的列表布局,由于BaseAdapter是一个抽象类,使用该类需要自己写一个适配器继承该类,正是由于继承了该类,需要我们重写一些方法,让我们可以在代码里控制列表的样式,更加灵活(ArrayList自定义适配器类似的用法)。
- public class MyBaseAdapter extends BaseAdapter {
- private List<Person> persons;
- Context context;
- public MyBaseAdapter(Context context,List<Person> persons){
- this.persons = persons;
- this.context = context;
- }
- @Override
- public int getCount() {
- return (persons==null)?0:persons.size();
- }
- @Override
- public Object getItem(int position) {
- return persons.get(position);
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- public class ViewHolder{
- TextView textViewItem01;
- TextView textViewItem02;
- TextView textViewItem03;
- ImageView imageView;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- final Person person = (Person)getItem(position);
- ViewHolder viewHolder = null;
- if(convertView==null){
- Log.d("MyBaseAdapter", "新建convertView,position="+position);
- convertView = LayoutInflater.from(context).inflate(
- R.layout.list_view01_item, null);
- viewHolder = new ViewHolder();
- viewHolder.textViewItem01 = (TextView)convertView.findViewById(
- R.id.listView01Item01);
- viewHolder.textViewItem02 = (TextView)convertView.findViewById(
- R.id.listView01Item02);
- viewHolder.textViewItem03 = (TextView)convertView.findViewById(
- R.id.listView01Item03);
- //动态增加1个ImageView
- viewHolder.imageView = new ImageView(context);
- LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- mParams.gravity = Gravity.CENTER;
- mParams.width=50;
- viewHolder.imageView.setLayoutParams(mParams);
- //这个ImageView放到ListView的第2列之后
- ((LinearLayout)convertView).addView(viewHolder.imageView,2);
- convertView.setTag(viewHolder);
- }else{
- viewHolder = (ViewHolder)convertView.getTag();
- Log.d("MyBaseAdapter", "旧的convertView,position="+position);
- }
- viewHolder.textViewItem01.setText(String.valueOf(person.id));
- viewHolder.textViewItem02.setText(person.name);
- viewHolder.textViewItem03.setText(person.address);
- viewHolder.imageView.setImageResource(person.photo);
- //对ListView中第1个TextView配置OnClick事件
- viewHolder.textViewItem01.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View v) {
- Toast.makeText(context,
- "[textViewItem01.setOnClickListener]点击了"+person.name,
- Toast.LENGTH_SHORT).show();
- }
- });
- //对ListView中的每一行信息配置OnClick事件
- convertView.setOnClickListener(new OnClickListener(){
- @Override
- public void onClick(View v) {
- Toast.makeText(context,
- "[convertView.setOnClickListener]点击了"+person.name,
- Toast.LENGTH_SHORT).show();
- }
- });
- //对ListView中的每一行信息配置OnLongClick事件
- convertView.setOnLongClickListener(new OnLongClickListener(){
- @Override
- public boolean onLongClick(View v) {
- Toast.makeText(context,
- "[convertView.setOnLongClickListener]点击了"+person.name,
- Toast.LENGTH_SHORT).show();
- return true;
- }
- });
- return convertView;
- }
- }