1.Android ArrayAdapter 详解

一、简单的。

这样的列表的每一行都只有一行文字。


[java]view plaincopy
  1. ListViewlist=(ListView)findViewById(R.id.list);
  2. String[]arr={" 百色学院","android技术开发","9701"};
  3. 构造函数:public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
  4. ArrayAdapter<String>arrayAdapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item1,arr);
  5. list.setAdapter(arrayAdapter);//为ListView设置Adapter

  6. 第一个参数是上下文context,就是当前的Activity,一般为this, 第二个参数是android sdk中自己内置的一个布局,它里面只有一个TextView,这个参数是表明我们数组中每一条数据都一一对应显示在这个view上面;第三个参数就是我们要显示的数据。listView会根据这三个参数,遍历数据源(如数组)里面的每一条数据,读出一条,显示到第二个参数对应的布局中。

  7. Android SDK中自己内置的一个布局如下:
    simple_list_item_1:TextView
    simple_list_item_2:TextView(字体略大); simple_list_item_checked:每个列表项都是一个已勾选的列表项。 simple_list_item_multiple_choice:每个列表都是带多选框的文本。 simple_list_item_single_choice:每个列表项都是带多单选按钮的文本。
[html] view plain copy
  1. <LinearLayout
  2. android:orientation="horizontal"
  3. andrlod:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:id="@+id/image"
  7. ......
  8. />
  9. <TextView
  10. android:id="@+id/title"
  11. .....
  12. />
  13. <LinearLayout>

二、样式丰富但内容简单的。

layout下的online_user_list_item.xml内容如下:

[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content">
  5. <TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/online_user_list_item_textview"android:text="TextView"></TextView>
  6. <Button
  7. android:text="button"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content">
  10. </Button>
  11. </LinearLayout>
里面含有的textview是我们想要展示内容的地方。那么构建ArrayAdapter时,应该这样写:
[java] view plain copy
  1. ArrayAdapter<String>adapter=newArrayAdapter<String>(this,R.layout.online_user_list_item,R.id.online_user_list_item_textview);

如果我们需要展示的内容是一仅一个textview承载不了的,还需要其它组件,怎么办?我们可以自定义。

三、内容丰富的(自定义ArrayAdapter)。

这就需要写一个类继承自ArrayAdapter并且重写getView方法。上代码:

[java] view plain copy
  1. publicclassUserListAdapterextendsArrayAdapter<User>{
  2. privateintresourceId;
  3. publicUserListAdapter(Contextcontext,inttextViewResourceId,List<User>objects){
  4. super(context,textViewResourceId,objects);
  5. this.resourceId=textViewResourceId;
  6. }
  7. @Override
  8. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  9. Useruser=getItem(position);
  10. LinearLayoutuserListItem=newLinearLayout(getContext());
  11. Stringinflater=Context.LAYOUT_INFLATER_SERVICE;
  12. LayoutInflatervi=(LayoutInflater)getContext().getSystemService(inflater);
  13. vi.inflate(resourceId,userListItem,true);
  14. TextViewtvUsername=(TextView)userListItem.findViewById(R.id.tv_user_list_username);
  15. TextViewtvAskedNum=(TextView)userListItem.findViewById(R.id.tv_user_list_askednum);
  16. TextViewtvLastMsg=(TextView)userListItem.findViewById(R.id.tv_user_list_lastmsg);
  17. tvUsername.setText(user.getUsername());
  18. tvAskedNum.setText(String.valueOf(user.getAskedNum()));
  19. tvLastMsg.setText(user.getLastMsg());
  20. returnuserListItem;
  21. }
  22. }

activity里就这样写

[java] view plain copy
  1. List<User>users=newArrayList<User>();
  2. Useruser=newUser();
  3. user.setAskedNum(8);
  4. user.setLastMsg("hello");
  5. user.setUsername("pxx");
  6. users.add(user);
  7. users.add(user);
  8. users.add(user);
  9. UserListAdapteradapter=newUserListAdapter(this,R.layout.online_user_list_item,users);
  10. listview.setAdapter(adapter);

2.Android SimpleAdapter 详解
[java] view plain copy
  1. listViewlistview=(ListView)findViewById(R.id.listView1);
  2. int[]imageId=newint[]{R.drawable.imag0,R.drawable.imag1,R.drawable.imag2};
  3. String[]title=newString[]{"百色学院","android技术开发","电气13班"};
  4. List<Map<String,Object>>listItems=newArrayList<Map<String,Object>>();//创建一个List集合
  5. for(inti=0;i<imageld.length;i++){//遍历数组
  6. Map<String,Object>map=newHashMap<String,Object>();//创建哈希表
  7. map.put("image",imageId[i]);
  8. map.put("title",title[i]);
  9. listItems.add(map);}
  10. SimpleAdapteradapter=newSimpleAdapter(this,listItems,R.layout.items,newString[]{"title","image"},new
  11. int[]{"R.id.title","R.id.image"});
  12. listView.setAdapter(adapter);
  13. 构造参数:
  14. SimpleAdapter(Contextcontext, List<? extends Map<String, ?>>data, int resource, String[]from, int[] to)
    1,context:上下文。
    2,data:基于Map的list。Data里边的每一项都和 ListView里边的每一项对应。Data里边的每一项都是一个Map类型,这个Map类里边包含了ListView每一行需要的数据。
    3,resource :就是一个布局layout,可引用系统提供的,也可以自定义。
    4,Map对象的key
    5,to表示组件的id

3.Android BaseAdapter 详解

list_item.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal">
  6. <ImageView
  7. android:id="@+id/img"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. />
  11. <LinearLayout
  12. android:layout_width="fill_parent"
  13. android:layout_height="wrap_content"
  14. android:orientation="vertical"
  15. >
  16. <TextView
  17. android:id="@+id/tv"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:textSize="20sp"
  21. />
  22. <TextView
  23. android:id="@+id/info"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content"
  26. android:textSize="14sp"
  27. />
  28. </LinearLayout>
  29. </LinearLayout>

当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度逐一绘制ListView的每一行。也就是说,如果让getCount()返回1,那么只显示一行。而getItem()getItemId()则在需要处理和取得Adapter中的数据时调用。那么getView如何使用呢?如果有10000行数据,就绘制10000次?这肯定会极大的消耗资源,导致ListView滑动非常的慢,那应该怎么做呢?

ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。当我们判断convertView==null的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。(看下面代码中)如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。也就是说convertView相当于一个缓存,开始为0,当有条目变为不可见,它缓存了它的数据,后面再出来的条目只需要更新数据就可以了,这样大大节省了系统资料的开销convertView为空时,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象。当convertView不为空,重复利用已经创建的view的时候,使用getTag()方法获取绑定的ViewHolder对象,这样就避免了findViewById对控件的层层查询,而是快速定位到控件。


Activity

[java] view plain copy
  1. packagecom.demo;
  2. importjava.util.ArrayList;
  3. importjava.util.HashMap;
  4. importjava.util.List;
  5. importjava.util.Map;
  6. importandroid.app.Activity;
  7. importandroid.content.Context;
  8. importandroid.os.Bundle;
  9. importandroid.view.LayoutInflater;
  10. importandroid.view.View;
  11. importandroid.view.ViewGroup;
  12. importandroid.widget.BaseAdapter;
  13. importandroid.widget.ImageView;
  14. importandroid.widget.ListView;
  15. importandroid.widget.TextView;
  16. publicclassDemoActivityextendsActivity{
  17. privateListViewlv;
  18. privateList<Map<String,Object>>data;
  19. @Override
  20. publicvoidonCreate(BundlesavedInstanceState){
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.main);
  23. lv=(ListView)findViewById(R.id.lv);
  24. //获取将要绑定的数据设置到data中
  25. data=getData();
  26. MyAdapteradapter=newMyAdapter(this);
  27. lv.setAdapter(adapter);
  28. }
  29. privateList<Map<String,Object>>getData()
  30. {
  31. List<Map<String,Object>>list=newArrayList<Map<String,Object>>();
  32. Map<String,Object>map;
  33. for(inti=0;i<10;i++)
  34. {
  35. map=newHashMap<String,Object>();
  36. map.put("img",R.drawable.ic_launcher);
  37. map.put("title","android");
  38. map.put("info","自定义adaper...");
  39. list.add(map);
  40. }
  41. returnlist;
  42. }
  43. //ViewHolder静态类
  44. staticclassViewHolder
  45. {
  46. publicImageViewimg;
  47. publicTextViewtitle;
  48. publicTextViewinfo;
  49. }
  50. publicclassMyAdapterextendsBaseAdapter
  51. {
  52. privateLayoutInflatermInflater=null;
  53. privateMyAdapter(Contextcontext)
  54. {
  55. //根据context上下文加载布局,这里的是Demo17Activity本身,即this
  56. this.mInflater=LayoutInflater.from(context);
  57. }
  58. @Override
  59. publicintgetCount(){
  60. //在此适配器中所代表的数据集中的条目数
  61. returndata.size();
  62. }
  63. @Override
  64. publicObjectgetItem(intposition){
  65. //获取数据集中与指定索引对应的数据项
  66. returnposition;
  67. }
  68. @Override
  69. publiclonggetItemId(intposition){
  70. //获取在列表中与指定索引对应的行id
  71. returnposition;
  72. }
  73. //获取一个在数据集中指定索引的视图来显示数据
  74. @Override
  75. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  76. ViewHolderholder=null;
  77. //如果缓存convertView为空,则需要创建View
  78. if(convertView==null)
  79. {
  80. holder=newViewHolder();
  81. //根据自定义的Item布局加载布局
  82. convertView=mInflater.inflate(R.layout.list_item,null);
  83. holder.img=(ImageView)convertView.findViewById(R.id.img);
  84. holder.title=(TextView)convertView.findViewById(R.id.tv);
  85. holder.info=(TextView)convertView.findViewById(R.id.info);
  86. //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
  87. convertView.setTag(holder);
  88. }else
  89. {
  90. holder=(ViewHolder)convertView.getTag();
  91. }
  92. holder.img.setBackgroundResource((Integer)data.get(position).get("img"));
  93. holder.title.setText((String)data.get(position).get("title"));
  94. holder.info.setText((String)data.get(position).get("info"));
  95. returnconvertView;
  96. }
  97. }
  98. }

更多相关文章

  1. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  2. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  3. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  4. android关于获取摄像头帧数据转成图片
  5. Android学习笔记----HttpURLConnection 和 HttpClient(已经被废
  6. Android小程序之音乐播放列表
  7. Android(安卓)AsyncTaskLoader需要注意的问题
  8. Android数据存储(3)SQLite简介和简单的登录与注册源代码
  9. Settings 界面修改

随机推荐

  1. android中视频播放的处理
  2. ListView如何去掉无所谓的阴影
  3. 做了一个手机上的直播系统
  4. android sqlite数据库封装 实现crud
  5. android中文api(79)――Gallery
  6. Android学习2--项目文件列表简单分析
  7. AIDL跨进程通信的使用
  8. android 图片切换,仿百叶窗效果
  9. listView透明背
  10. Android(安卓)Studio Tips(OSX)