ListView中常用Adapter

来源:互联网 发布:婚礼邀请函电子版软件 编辑:程序博客网 时间:2024/06/06 03:42

原创:http://write.blog.csdn.net/mdeditor

1) ArrayAdapter (数组适配器)数据比较简单,布局比较简单(数据只有一行时使用)
List集合里面放String

2) SimpleAdapter 一般适合数据比较复杂,布局比较复杂(有图片有文本)
List集合里面放的是map

3) BaseAdapter 自定义Adapter

4) ……
ArrayAdapter、SimpleAdaper都继承自BaseAdapter同时实现listAdapter接口(listAdapter继承于Adapter)

ArrayAdapter

ArrayAdapter (数组适配器)数据比较简单,布局比较简单(数据只有一行时使用)
List集合里面放String

1、 创建ListView
这里写图片描述
2、 创建Adapter适配器
(1) context
(2) item view
(3) item data
这里写图片描述
3、 ListView关联Adapter
Listlist=Arrays.asList(s);
由此方法转换的集合,此集合不能再去改变里面存储的数据(不能再添加或删除的操作)
这里写图片描述

SimpleAdapter

它实现了ListAdapter接口,对数据有严格的要求.它对应的数据必须为一个List集合 < ?extends Map < String,?>> (List集合里面放的是Map,Map的key为String,值为任意类型数据)表示:List集合里面的泛型类必须是Map或者是Map接口的实现类对象。

SimpleAdapter (Context context,  //thisList<?extends Map<String,?>>data,//listview中要显示的数据Int resouse,   //资源文件  布局文件中的idString[] from,  //data(显示数据)中map里的keyInt[] to)    //布局资源中显示数据view中的id);//借助SimpleAdapter对象实现一个ListView应用。

这里写图片描述

BaseAdapter

BaseAdapter是一个抽象类,次类中提供了一些抽象方法,此类中提供了一些抽象方法(也包括一些具体方法,具体方法都已经在此类中实现了),这些抽象方法通常要交给子类实现,例如我们的ArrayAdapter,SimpleAdapter都继承了此类,并重写了抽象方法。
当官方提供的适配器(ArrayAdapter或者SimpleAdapter或…….)不能满足我们的业务要求时,我们可以自己去定义适配器,直接或者间接的继承BaseAdapter,然后重写抽象方法。

ArrayAdapter适合放简单的一行数据 ,SimpleAdapter里面放的是map(键值对),所以需要自己BaseAdapter创建。

里面的item我们要动态生成,因为我们不知道有多少个item。

自定义adapter案例:

/**自定义适配器*/    class ContactAdapter extends BaseAdapter{        private List<Contact> contacts;        private int resource;        private Context context;        //仿照ArrayAdapter的构造方法        public ContactAdapter(Context context,        int resource,List<Contact> contacts) {            this.context=context;            this.contacts=contacts;            this.resource=resource;        }        /**此方法用户返回数据的个数*/        @Override        public int getCount() {            return contacts.size();        }        /**根据位置返回item对象对应的数据*/        @Override        public Object getItem(int position) {        return contacts.get(position);        }        /**此方法一般返回item的位置*/        @Override        public long getItemId(int position) {            return position;        }        /**返回item对象(包好的饺子)         * 每显示一个item,此方法就会调用一次。         * */        @Override        public View getView(int position,        View convertView, ViewGroup parent) {            Log.i("TAG", "convertView="+convertView);//列表项view控件            //1.item布局对象(饺子皮)            ViewHolder vh=null;            if(convertView==null){            convertView=View.inflate(context, resource, null);            vh=new ViewHolder();//一个老师座位表(座位上放数据)            vh.imageView=(ImageView)convertView.findViewById(R.id.imageView1);            vh.phoneTV=(TextView)convertView.findViewById(R.id.textView1);            vh.nameTV=(TextView)convertView.findViewById(R.id.textView2);            convertView.setTag(vh);            }else{             vh=(ViewHolder)convertView.getTag();               }            //2.item数据(饺子馅)            Contact c=contacts.get(position);            //3.将item数据放到item布局对象上(包饺子)            vh.imageView.setImageResource(c.getPhoto());            vh.phoneTV.setText(c.getPhone());            vh.nameTV.setText(c.getName());            return convertView;//包好的饺子(item)        }        /**借助此类的对象保存item布局对象中的子元素的地址         * 优点:减少findviewbyid的调用次数         * 缺点:内存中又多了几个ViewHolder对象*/        class ViewHolder{            ImageView imageView;            TextView phoneTV;            TextView nameTV;        }    }

MainActivity:

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //1.获得ListView         ListView lsv=(ListView)findViewById(R.id.listView01);        //2.准备数据         List<Contact> contacts=         DBContext.getContacts();        //3.item布局         int resource=R.layout.list_item_3;        //4.构建适配器         ContactAdapter adapter=         new ContactAdapter(this, resource,contacts);         //5.设置适配器         lsv.setAdapter(adapter);         //listview在显示数据时会调用adapter的         //getCount方法获得要显示的item记录的个数,         //然后调用adapter的getView方法获得一个一个的item         //最后将item显示出来。    }}

Context类:

/**联系人(值对象) *  * 对象:JavaBean * |-->值对象(封装数据) :实体Bean (Contact) * |-->业务处理对象(处理业务逻辑):业务Bean (DBContext) * |-->流程控制对象(流程控制):Activity *  * ListView (显示数据) * ------------------ * Activity (逻辑控制) * |-->获得ListView * |-->获得数据 * |-->构建Adapter * |-->设置Adapter(将Adapter中的数据交给ListView) * ----------------- * DBContext * |-->处理数据逻辑(将数据取出来以后封装到List<Contact>) * ----------------- * SQLite数据库 *  * */public class Contact {    /**名字*/    private String name;    /**手机号*/    private String phone;    /**头像*/    private int photo;    public Contact(String name,String phone,int photo) {        this.name=name;        this.phone=phone;        this.photo=photo;    }    public void setName(String name) {        this.name = name;    }    public void setPhone(String phone) {        this.phone = phone;    }    public String getName() {        return name;    }    public String getPhone() {        return phone;    }    public void setPhoto(int photo) {        this.photo = photo;    }    public int getPhoto() {        return photo;    }    @Override    public String toString() {        return "Contact [name=" + name + ", phone=" + phone + "]";    }}

DBContext:

import java.util.ArrayList;import java.util.List;/**借助此类访问数据库,将取到的数据 * 封装到List<Contact>集合*/public class DBContext {    private static List<Contact> contacts=    new ArrayList<Contact>();    /**假设数据来自数据库*/    static{      contacts.add(new Contact("AA", "139", R.drawable.png_01));          contacts.add(new Contact("AB", "138", R.drawable.png_02));          contacts.add(new Contact("CA", "137", R.drawable.png_03));          contacts.add(new Contact("CA", "136", R.drawable.png_04));          contacts.add(new Contact("DA", "135", R.drawable.png_05));          contacts.add(new Contact("DB", "133", R.drawable.png_06));          contacts.add(new Contact("EA", "134", R.drawable.png_07));          contacts.add(new Contact("FA", "131", R.drawable.png_08));        }    public static List<Contact> getContacts(){        return contacts;    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 毕业证上没照片怎么办 怎么办学历学位认证证明 教育部学历学位认证怎么办 兵役登记被注册怎么办 学信网手机号忘了怎么办 注销手机号了学信网怎么办 学信网手机换了怎么办 学籍不在籍结业怎么办 电教馆的幼师证怎么办 中考不够建档线怎么办 医保漏交一年怎么办 南通图书馆怎么办饭卡 工商银行卡坏了怎么办 北京一卡通丢了怎么办 甲状腺右叶结节怎么办 ca证书掉了怎么办 地税ca丢了怎么办 南京乘车卡丢失怎么办 老干妈瓶盖打不开怎么办 金陵图书馆书丢失怎么办 幼师资格证丢了怎么办 双证毕业没有怎么办 幼师面试没特长怎么办 资格证到6年没换怎么办 中央巡视组走了怎么办 校园招聘学生违约怎么办 应届毕业生考上公务员档案怎么办 移动硬盘弹不出来怎么办 录音笔电池坏了怎么办 上不吃大厕怎么办 跨考研究生面试怎么办 手机信息查重怎么办 闲鱼不予申诉怎么办 广东理工职业学院没选到课怎么办 淘宝开店认证后怎么办 手机微信解冻怎么办 微信永久封号怎么办 拒绝微信登录怎么办 微信支付冻结怎么办 微信被冻结了钱怎么办 爱剪辑视频卡顿怎么办