Android复习之旅--ListView中Adapter的使用

在应用程序中,经常会用ListView以列表的方式来显示数据,那么下面就开始对ListView进行简单的介绍。

列表显示需要三个要素:

  • ListView
  • 适配器
  • 数据

其中,适配器是将数据显示到ListView的桥梁,使用好适配器是重中之重

用于显示ListView的适配器有ArrayAdapter、SimpleAdapter、SimpleCursorAdapter和BaseAdapter等。

ArrayAdapter

/** 
 * Context context:上下文 
 * int resource:布局文件(可选,使用自己定义的xml布局中的控件时指定)
 * int textViewResourceId:布局资源内的组件id 
 * T[]或List<T> objects:数据
 */
ArrayAdapter adapter = new ArrayAdapter<T>(context, [resource,] textViewResourceId, objects);

例子:
// 字符串数组作为数据
String [] data= {"Ada", "Ben", "Candy", "David", "Ella"} ;
ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_2, data);
listView.setAdapter(adapter);

// List数据
ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_2, getData());
listView.setAdapter(adapter);
private List<String> getData(){
    List<String> data = new ArrayList<String>();
    data.add("测试数据1");
    data.add("测试数据2");
    data.add("测试数据3");
    data.add("测试数据4");

    return data;
}

SimpleAdapter

/** 
 * Context context:上下文 
 * List<? extends Map<String, ?>> data:数据 
 * int resource:布局文件
 * String[] from:map数据的名字 
 * int[] to:对应布局资源内组件的id
 */
SimpleAdapter adapter = new SimpleAdapter(context, data, resource, from, to) ;

例子:
SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[]{"title", "icon"}, new int[]{R.id.title, R.id.icon});
listView.setAdapter(adapter);

private List<Map<String, Object>> getData(){
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("title", "摩托罗拉");
    map.put("icon", R.drawable.icon1);
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("title", "诺基亚");
    map.put("icon", R.drawable.icon2);
    list.add(map);
 
    map = new HashMa<String, Object>();
    map.put("title", "小米");
    map.put("icon", R.drawable.icon3);
    list.add(map);

    return list;
}

SimpleCursorAdapter

/** 
 * Context context:上下文
 * int layout:布局文件
 * Cursor c:数据库的游标
 * String[] from:数据库表中的字段数组
 * int[] to:对应布局文件内组件的id
 */
SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, layout, c, from, to)

例子:
Cursor cursor = db.rawQuery("select * from info", null);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.simplecursor, cursor, new String[]{"title", "icon"}, new int[]{R.id.title, R.id.icon});
listView.setAdapter(adapter);

数据库表:
| _id | title | icon |
| 1 | 摩托罗拉 | R.drawable.icon1 |
| 2 | 小米2s | R.drawable.icon2 |
| 3 | 诺基亚 | R.drawable.icon3 |

BaseAdapter

在这里就不把原始和优化后的做对比了,直接写优化后的BaseAdapter

// ...忽略novels的来源
NovelsAdapter adapter = new NovelsAdapter(this, novels);
listView.setAdapter(adapter);

public class NovelsAdapter extends BaseAdapter {
   private Context context;
   private List <NovelInfo> novels;  //设置数据

   public NovelsAdapter(Context context, List <NovelInfo> novels) {
         this. context = context ;
         this. novels = novels ;
   }

   @Override
   public int getCount() {
         return novels.size();
   }

   @Override
   public Object getItem(int position) {
         return novels.get(position) ;
   }

   @Override
   public long getItemId(int position) {
         return position;
   }

   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
         View view = convertView;
         ViewHolder holder;

         if (view == null){
              // 获取布局文件中的控件
              view = LayoutInflater.from(context).inflate(R.layout.novel_item, null) ;
              holder = new ViewHolder() ;

              holder.name= (TextView) view.findViewById(R.id.tv_novel_name) ;
              holder.author = (TextView) view.findViewById(R.id.tv_novel_author) ;
              holder.type = (TextView) view.findViewById(R.id. tv_novel_type) ;

              view.setTag(holder); //打一个标记
         } else{
              holder = (ViewHolder) view.getTag();  //取出标记
         }

         // 为控件绑定数据
         NovelInfo novel = (NovelInfo) getItem(position) ;
         holder.name.setText(novel.name) ;
         holder.author.setText(novel.author) ;
         holder.type.setText (novel.typeName) ;

         return view;
   }

   static class ViewHolder{
         TextView name;
         TextView author;
         TextView type;
   }

}

NovelInfo.java:
public class NovelInfo {
    public String name;// 小说名称
    public String author;// 小说作者
    public String type;// 小说类型
}

还有就是尽量避免在getView()中进行耗时操作,应使用异步的方式为item的布局设置数据,如果是在需要同步,则要在Adapter初始化时将数据加载好,然后再在getView()中绑定数据。


其实现在ListView已经算是过时了,现在的大神们都是使用RecyclerView。RecyclerView的功能非常强大,能实现ListView和GridView还有瀑布流等效果,从ListView转换为GridView只需几行代码。

网上有很多大神们分享的关于RecyclerView的案例,大家可以google搜索几篇文章来学习

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容