SimpleAdapter

SimpleAdapter是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。

[java] view plain copy
  1. SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

参数说明:
context: SimpleAdapter关联的View的运行对象

data: 一个Map组成的List数据结构,在列表中的每个条目对应列表中的一行,每一个Map中应该包含所有在from参数中指定的键(Key)

resource: 一个定义列表项的布局文件的资源ID,布局文件将至少包含那些在to中定义的ID

from: 一个将被添加到Map映射上的键名(key)

to: 将绑定数据的视图的ID(map中的value),跟from对数对应,并且应该是view

在ListView中使用样例:

[java] view plain copy
  1. List< Map<String, Object> > listItems = new ArrayList< Map<String, Object> >();
  2. for( int i = 0; i < files.length; ++ i )
  3. {
  4. Map<String, Object> itemMap = new HashMap<String, Object>();
  5. if( files[i].isDirectory() )
  6. {
  7. itemMap.put("icon", R.drawable.folder);
  8. }
  9. else if( files[i].isFile() )
  10. {
  11. itemMap.put("icon", R.drawable.file);
  12. }
  13. itemMap.put("fileName", files[i].getName());
  14. listItems.add(itemMap);
  15. }
  16. SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line,
  17. new String[]{"icon", "fileName"}, new int[]{R.id.icon, R.id.file_name});
  18. listView.setAdapter(simpleAdapter);

new String[]{"icon", "fileName"} 是 构造函数中的 from 他表示了我的map里面键值对key只有icon、fileName这两个key
new int[]{R.id.icon, R.id.file_name} 是 构造函数中的 to 他表示了我map里面键值对value的资源ID
R.layout.line 是 构造函数中的 resource 他表示一个资源文件
内容如下:

line.xml

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns: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/icon"
  8. android:layout_width="40dp"
  9. android:layout_height="40dp"
  10. android:paddingLeft="10dp"
  11. android:src="@drawable/abc_ab_bottom_solid_dark_holo" />
  12. <TextView
  13. android:id="@+id/file_name"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_gravity="center_vertical"
  17. android:paddingBottom="10dp"
  18. android:paddingLeft="10dp"
  19. android:paddingTop="10dp"
  20. android:textSize="16dp" />
  21. </LinearLayout>

里面要包括from和to里面的内容。

ArrayAdapter

ArrayAdapter 数组适配器,一般用于显示一行文本信息,相对比较简单,默认的ArrayAdapter期望接受的样式文件只含有一个textview,然后它把

接受到的数据toString显示出来,但是他有6个构造函数(够多的呀),我们挑几个复杂常用点的介绍:

[java] view plain copy
  1. ArrayAdapter(Context context, int resource)
  2. ArrayAdapter(Context context, int resource, int textViewResourceId)

之所以把上面两个构造函数放一起说,是因为其实他们可以当成一体的,看下面例子:

[java] view plain copy
  1. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
  2. android.R.layout.simple_expandable_list_item_1);
  3. adapter.add("string1");
  4. adapter.add("haha");
  5. adapter.add("heihei");
  6. listview.setAdapter(adapter);

android.R.layout.simple_expandable_list_item_1为android自己提供的样式,
当然我们可以换成我们自己的样式,看下面:

[java] view plain copy
  1. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="wrap_content"
  3. android:layout_height="wrap_content"
  4. android:id="@+id/online_user_list_item_textview" >
  5. </TextView>

有没有发觉这个xml文件有什么不同?是的,他没有布局,如果使用上面的ArrayAdapter(Context context, int resource)构造函数,那么对应的xml资

源文件仅只能有一个TextView,那么我们非要使用多个控件,还要使用布局怎么办?使用上面第二个构造函数,他的第三个参数就是用来指定TextView

的,看下面布局文件:

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:id="@+id/online_user_list_item_textview"
  9. android:text="TextView"></TextView>
  10. <Button
  11. android:text="button"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content">
  14. </Button>
  15. </LinearLayout>

里面含有的textview是我们想要显示内容的地方,那么我们改成下面代码就好了

[java] view plain copy
  1. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.online_user_list_item,
  2. R.id.online_user_list_item_textview);

简单的构造函数介绍完了,看看稍微复杂点的。

[java] view plain copy
  1. ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
  2. ArrayAdapter(Context context, int resource, List<T> objects)

context:关联的对象

resource:资源文件ID

List: 一个list对象

上面这两个构造函数和最开始的介绍的一样,相差无异,只是多了一个textviewid,这样就意味着可以使用复杂的资源xml文件,只需要告诉
textview的id就ok了,看下面的例子。

我们在一个布局xml资源中放置一个ImageView,一个TextView,内容如下:

list_item.xml 文件

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns: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. android:src="@drawable/ic_launcher"
  11. />
  12. <TextView
  13. android:id="@+id/tv"
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. />
  17. </LinearLayout>

使用代码只需要更改成如下:

[java] view plain copy
  1. private ArrayList<String> list = new ArrayList<String>();
  2. @Override
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.main);
  6. lv = (ListView)findViewById(R.id.listview);
  7. ArrayAdapter<String> adapter = new ArrayAdapter<String>(
  8. this,
  9. R.layout.list_item,
  10. R.id.tv,
  11. getData());
  12. lv.setAdapter(adapter);
  13. }
  14. private ArrayList<String> getData()
  15. {
  16. list.add("180平米的房子");
  17. list.add("一个勤劳漂亮的老婆");
  18. list.add("一辆宝马");
  19. list.add("一个强壮且永不生病的身体");
  20. list.add("一个喜欢的事业");
  21. return list;
  22. }

这样就实现一个带上图片+文字的list列表了,效果看上去和SimpleAdapter差不多,但是不如SimpleAdapter灵活。如果要实现更复杂的效果就要

重载ArrayAdapter中的getView()函数了,这里不给出来,请看下面链接:
http://blog.csdn.net/nairuohe/article/details/6457300
http://www.cnblogs.com/sayo/archive/2010/12/30/1922590.html
http://www.cnblogs.com/xirihanlin/archive/2009/08/03/1537609.html
http://blog.csdn.net/andie_guo/article/details/12554321 此链接重写实现了AutoComplete功能

那还不如直接使用BaseAdapter,全部重写,下面就来看看BaseAdapter

BaseAdapter

它是直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,但是这会涉及到ListView优化等问题了。

使用BaseAdapter就需要继承他,然后重写里面的许多方法。

[java] view plain copy
  1. class MyAdapter extends BaseAdapter
  2. {
  3. private Context context;
  4. public MyAdapter(Context context)
  5. {
  6. this.context = context;
  7. }
  8. @Override
  9. public int getCount() {
  10. // How many items are in the data set represented by this Adapter.(在此适配器中所代表的数据集中的条目数)
  11. return 0;
  12. }
  13. @Override
  14. public Object getItem(int position) {
  15. // Get the data item associated with the specified position in the data set.(获取数据集中与指定索引对应的数据项)
  16. return null;
  17. }
  18. @Override
  19. public long getItemId(int position) {
  20. // Get the row id associated with the specified position in the list.(取在列表中与指定索引对应的行id)
  21. return 0;
  22. }
  23. @Override
  24. public View getView(int position, View convertView, ViewGroup parent) {
  25. // Get a View that displays the data at the specified position in the data set.
  26. return null;
  27. }
  28. }

这里面没什么难度,但是这个getView方法必须好好处理,也是最麻烦的

第一种:没有任何处理,不建议这样写。如果数据量少还可以凑合,但是如果列表项数据量很大的时候,会每次都重新创建View,设置资源,严重影响性

能,所以从一开始就不要用这种方式:

[java] view plain copy
  1. @Override
  2. public View getView(int position, View convertView, ViewGroup parent)
  3. {
  4. View item = mInflater.inflate(R.layout.list_item, null);
  5. ImageView img = (ImageView)item.findViewById(R.id.img)
  6. TextView title = (TextView)item.findViewById(R.id.title);
  7. TextView info = (TextView)item.findViewById(R.id.info);
  8. img.setImageResource(R.drawable.ic_launcher);
  9. title.setText("Hello");
  10. info.setText("world");
  11. return item;
  12. }

第二种ListView优化:通过缓存convertView,这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中

的View,提升了性能:

[java] view plain copy
  1. public View getView(int position, View convertView, ViewGroup parent)
  2. {
  3. //重点在这里面
  4. if(convertView == null)
  5. {
  6. convertView = mInflater.inflate(R.layout.list_item, null);
  7. }
  8. ImageView img = (ImageView)convertView.findViewById(R.id.img)
  9. TextView title = (TextView)convertView.findViewById(R.id.title);
  10. TextView info = (TextView)ConvertView.findViewById(R.id.info);
  11. img.setImageResource(R.drawable.ic_launcher);
  12. title.setText("Hello");
  13. info.setText("world");
  14. return convertView;
  15. }

ArrayAdapter和SimpleAdapter、BaseAdapter相关推荐

  1. 【Android】Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法

    Android适配器之ArrayAdapter.SimpleAdapter和BaseAdapter的简单用法与有用代码片段 ArrayAdapter.SimpleAdapter和BaseAdapter ...

  2. Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段

    收藏ArrayAdapter.SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法. 1.ArrayAdapter 只可以简单的显示一行文本 代码片段: Arr ...

  3. (1)Adapter适配器(ArrayAdapter、SimpleAdapter、BaseAdapter)

    ArrayAdapter(数组适配器) ArrayAdapter只能显示一行文本数据 ArrayAdapter(@NonNull Context context, @LayoutRes int res ...

  4. Android的ArrayAdapter、SimpleAdapter、BaseAdapter与ListView的使用

    工程目录: MainActivity package com.example.demo_four;import androidx.appcompat.app.AppCompatActivity;imp ...

  5. android--(布局ListView、优化、刷新分页、ArrayAdapter、SimpleAdapter 、BaseAdapter)

    ListView组件: 列表视图是Android 中最为常用的一种视图组件,它以垂直列表的方式列出 需要显示的列表项,例如:显示联系人名单.系统设置项等,都用到了ListView组件 public c ...

  6. 适配器AdapterView(ArrayAdapter SimpleAdapter BaseAdapter)

    Android中对于适配器的理解: android开发中会大量使用到Listview  而 ListView 需要适配器才能使用,不同场合使用不同的适配器.接了下来 浅谈一下三个常用的适配器,概念及其 ...

  7. [安卓开发] 下拉框Spinner与适配器ArrayAdapter/SimpleAdapter的使用

    目录 简单介绍Spinner和Adapter ArrayAdapter实现以对话框形式展示下拉框(纯文字) Simple实现以对话框形式展示下拉框(图片加文字) 简单介绍Spinner和Adapter ...

  8. Android之ArrayAdapter使用

    Adapter常用的实现方式ArrayAdapter.simpleAdapter.SimpleCursorAdapter.BaseAdapter. 1.ArrayAdapter通常用于将数组或List ...

  9. Android: BaseAdapter 实现分页

    小记记代码   列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View. 2.适配器 用来把数据映射到ListView上的中介. 3.数据    具体的将被映射的字符串,图片,或者基本 ...

最新文章

  1. 理解python的with as 语句
  2. Android ViewPager
  3. liferay6.2 struts2 request.getparameter取值为null
  4. 简易 责任链的两种实现方式
  5. 渗透测试流程信息收集
  6. JQuery iframe页面通过parent方法操作父页面中的元素与方法(实例讲解)
  7. 如何在软件里显示编译时间
  8. 接口(Api)版本号命名规则
  9. JavaScript 通过身份证号获取出生日期、年龄、性别 、籍贯
  10. 74xx系列芯片类型及功能概览
  11. 【单片机】2.2 AT89S52的引脚功能
  12. GitHub上超火的“算法宝典”,程序员开发指南
  13. java代码合成多张图片成一张
  14. POI框架EXCEL解析性能优化
  15. 网页中使用的特殊字体(webdings, wingdings 2)续
  16. 数据库树形结构存储方法的选择
  17. 电脑开机启动时打开某个Excel表格
  18. linux开机自启服务
  19. 二进制、八进制、十进制、十六进制之间的互相转化
  20. Win10系统Anaconda下安装TensorFlow、Karas和PyTorch

热门文章

  1. 全面拥抱 K8s,ApacheDolphinScheduler 应用与支持 K8s 任务的探索
  2. oracle不用密码备份,oracle用备份的控制文件恢复后不用resetlogs打开方式的恢复
  3. 认识并使用 Promise
  4. Android RecyclerView数据展示
  5. 服务器运行aspx,aspx文件怎么打开?aspx是什么文件?
  6. JVM性能优化(四)提高网站访问性能之Tomcat优化
  7. DevExpress 16.2安装破解
  8. bum报文_VXLAN 简介
  9. PostgreSQL UPDATE 语句
  10. 软件测试及专业,常用软件及专业软件测试