Adapter相当于一个数据源,可以给AdapterView提供数据,并根据数据创建对应的UI,可以通过调用AdapterView的setAdapter方法使得AdapterView将Adapter作为数据源。
dapter 计模式中的一种,就是适配器的意思。
- BaseAdapter继承它需要实现较多的方法,所以也就具有较高的灵活性,是一个抽象类。
- ArrayAdapter支持泛型操作,最为简单,只能展示一行字。从BaseAdapter派生来
- SimpleAdapter有最好的扩充性,可以自定义出各种效果。
- SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
ArrayAdapter
ListView listView = (ListView)findViewById(R.id.listView);
String[] values = {"iPhone","小米","三星","华为","中兴","联想","黑莓","魅族"};
List<String> list = new ArrayList<>(Arrays.asList(values));
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
listView.setAdapter(adapter);
扩展
//List<String> list = Arrays.asList(values);
List<String> list = new ArrayList<>(Arrays.asList(values));
//Arrays.asList(values)返回的是一个只读的List,不能进行add和remove
//new ArrayList<>(Arrays.asList(values))则是一个可写的List,可以进行add和remove
SimpleAdapter
ListView listView = (ListView)findViewById(R.id.listView);
final String[] names = {"Windows","Mac OS","Linux","Android","Chrome OS"};
final String[] descriptions = {
"Windows是微软公司的操作系统",
"Mac OS是苹果公司的操作系统",
"Linux是开源免费操作系统",
"Android是Google公司的智能手机操作系统",
"Chrome OS是Google公司的Web操作系统"
};
final int[] icons = { R.drawable.windows, R.drawable.mac, R.drawable.linux
R.drawable.androi ,R.drawable.chrome
};
List<Map<String, Object>> list = new ArrayList<>();
for(int i = 0; i < names.length; i++){
HashMap<String, Object> map = new HashMap<>();
map.put("name", names[i]);
map.put("description", descriptions[i]);
map.put("icon", icons[i]);
list.add(map);
}
//每个数据项对应一个Map,from表示的是Map中key的数组
String[] from = {"name", "description", "icon"};
//数据项Map中的每个key都在layout中有对应的View,
//to表示数据项对应的View的ID数组
int[] to = {R.id.name, R.id.description, R.id.icon};
//R.layout.item表示数据项UI所对应的layout文件
SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.item, from, to);
listView.setAdapter(adapter)
PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter、 FragmentStatePagerAdapter,这两个adapter都是Fragment的适配器
FragmentPagerAdapter与FragmentStatePagerAdapter的区别主要在fragment的销毁上
FragmentPagerAdapter:对于不再需要的fragment,选择调用onDetach()方法,仅销毁视图,并不会销毁fragment实例。
FragmentStatePagerAdapter:会销毁不再需要的fragment,当当前事务提交以后,会彻底的将fragmeng从当前Activity的FragmentManager中移除,state标明,销毁时,会将其onSaveInstanceState(Bundle outState)中的bundle信息保存下来,当用户切换回来,可以通过该bundle恢复生成新的fragment,也就是说,你可以在onSaveInstanceState(Bundle outState)方法中保存一些数据,在onCreate中进行恢复创建。
如上所说,使用FragmentStatePagerAdapter当然更省内存,但是销毁后新建也是需要时间的。一般情况下,如果你是制作主页面,就3、4个Tab,那么可以选择使用FragmentPagerAdapter,如果你是用于ViewPager展示数量特别多的条目时,那么建议使用FragmentStatePagerAdapter。