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; }}
- ListView中常用Adapter
- listview adapter 常用适配器
- ListView中Adapter的自定义
- 在ListView中自定义Adapter
- ListView中adapter的作用
- 常用控件——adapter listview spinner
- ListView以及常用Adapter使用总结
- Android中自定义Adapter和ListView
- ListView自定义adapter中处理多事件
- ListView 中Adapter的优化
- ListView 中Adapter的优化
- 自定义Adapter中对ListView的优化
- listview中 对adapter添加动画效果
- Android中ListView的Adapter和ContextMenu
- android 中ListView中的adapter详解
- Android中 listview与adapter用法
- Android中ListView通用adapter的实现
- ListView中adapter的简单封装
- Binder学习笔记(六)—— binder服务端是如何组织addService数据的?
- jsp response.sendRedirect不跳转的原因分析及解决
- 源码学习之IntenteService
- 大型网站技术架构(3):WEB 前端性能优化
- c++ const总结
- ListView中常用Adapter
- Nofication的使用
- windows tcp连接 recv()立即返回 接收字符为空
- c语言中包含math.h的时用gcc编译要加-lm参数
- Binder学习笔记(七)—— ServiceManager如何响应addService请求 ?
- struts2开发时通过interceptor拦截器实现输入数据过滤前后空格的功能
- C还可以这么玩第二期
- Android开发,30行代码集成图片轮播RollViewpager,你说快吗?
- 封装类:即8种基本类型对应8种封装类