ListView中常用Adapter
2016-05-15 15:24
405 查看
原创:http://write.blog.csdn.net/mdeditor
1) ArrayAdapter (数组适配器)数据比较简单,布局比较简单(数据只有一行时使用)
List集合里面放String
2) SimpleAdapter 一般适合数据比较复杂,布局比较复杂(有图片有文本)
List集合里面放的是map
3) BaseAdapter 自定义Adapter
4) ……
ArrayAdapter、SimpleAdaper都继承自BaseAdapter同时实现listAdapter接口(listAdapter继承于Adapter)
List集合里面放String
1、 创建ListView
2、 创建Adapter适配器
(1) context
(2) item view
(3) item data
3、 ListView关联Adapter
Listlist=Arrays.asList(s);
由此方法转换的集合,此集合不能再去改变里面存储的数据(不能再添加或删除的操作)
当官方提供的适配器(ArrayAdapter或者SimpleAdapter或…….)不能满足我们的业务要求时,我们可以自己去定义适配器,直接或者间接的继承BaseAdapter,然后重写抽象方法。
ArrayAdapter适合放简单的一行数据 ,SimpleAdapter里面放的是map(键值对),所以需要自己BaseAdapter创建。
里面的item我们要动态生成,因为我们不知道有多少个item。
自定义adapter案例:
MainActivity:
Context类:
DBContext:
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, //this List<?extends Map<String,?>>data,//listview中要显示的数据 Int resouse, //资源文件 布局文件中的id String[] from, //data(显示数据)中map里的key Int[] 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; } }
相关文章推荐
- 代理服务器与网络地址转换NAT
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
- Binder学习笔记(六)—— binder服务端是如何组织addService数据的?
- c++ const总结
- jsp response.sendRedirect不跳转的原因分析及解决
- 记一次iphone 微信内置浏览器跨域无法获取cookie问题的解决方法
- iOS @synchronized 详解
- linux命令行下的ftp 多文件下载和目录下载
- Spring4新特性简述
- 网络流二十四题之十八 —— 分配问题
- Binder学习笔记(五)—— Parcel是怎么打包的?
- Android 添加背景音乐代码实现,以及创建音频文件夹
- mysql分区表的维护
- Eclipse maven构建项目
- (转载)Unity3d中的属性(Attributes)整理
- Linux发行版 CentOS6.5下的分区操作
- CSS、JS中的相对路径引用的区别
- Arduino 与 土壤湿度传感器 测量土壤湿度自动浇水提醒
- Map的按value值排序
- Binder学习笔记(四)—— ServiceManager如何响应checkService请求