ArrayAdapter和SimpleAdapter、BaseAdapter
SimpleAdapter
SimpleAdapter是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图。
- 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中使用样例:
- List< Map<String, Object> > listItems = new ArrayList< Map<String, Object> >();
- for( int i = 0; i < files.length; ++ i )
- {
- Map<String, Object> itemMap = new HashMap<String, Object>();
- if( files[i].isDirectory() )
- {
- itemMap.put("icon", R.drawable.folder);
- }
- else if( files[i].isFile() )
- {
- itemMap.put("icon", R.drawable.file);
- }
- itemMap.put("fileName", files[i].getName());
- listItems.add(itemMap);
- }
- SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line,
- new String[]{"icon", "fileName"}, new int[]{R.id.icon, R.id.file_name});
- 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
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" >
- <ImageView
- android:id="@+id/icon"
- android:layout_width="40dp"
- android:layout_height="40dp"
- android:paddingLeft="10dp"
- android:src="@drawable/abc_ab_bottom_solid_dark_holo" />
- <TextView
- android:id="@+id/file_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_vertical"
- android:paddingBottom="10dp"
- android:paddingLeft="10dp"
- android:paddingTop="10dp"
- android:textSize="16dp" />
- </LinearLayout>
里面要包括from和to里面的内容。
ArrayAdapter
ArrayAdapter 数组适配器,一般用于显示一行文本信息,相对比较简单,默认的ArrayAdapter期望接受的样式文件只含有一个textview,然后它把
接受到的数据toString显示出来,但是他有6个构造函数(够多的呀),我们挑几个复杂常用点的介绍:
- ArrayAdapter(Context context, int resource)
- ArrayAdapter(Context context, int resource, int textViewResourceId)
之所以把上面两个构造函数放一起说,是因为其实他们可以当成一体的,看下面例子:
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_expandable_list_item_1);
- adapter.add("string1");
- adapter.add("haha");
- adapter.add("heihei");
- listview.setAdapter(adapter);
android.R.layout.simple_expandable_list_item_1为android自己提供的样式,
当然我们可以换成我们自己的样式,看下面:
- <TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/online_user_list_item_textview" >
- </TextView>
有没有发觉这个xml文件有什么不同?是的,他没有布局,如果使用上面的ArrayAdapter(Context context, int resource)构造函数,那么对应的xml资
源文件仅只能有一个TextView,那么我们非要使用多个控件,还要使用布局怎么办?使用上面第二个构造函数,他的第三个参数就是用来指定TextView
的,看下面布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/online_user_list_item_textview"
- android:text="TextView"></TextView>
- <Button
- android:text="button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- </LinearLayout>
里面含有的textview是我们想要显示内容的地方,那么我们改成下面代码就好了
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.online_user_list_item,
- R.id.online_user_list_item_textview);
简单的构造函数介绍完了,看看稍微复杂点的。
- ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
- ArrayAdapter(Context context, int resource, List<T> objects)
context:关联的对象
resource:资源文件ID
List: 一个list对象
上面这两个构造函数和最开始的介绍的一样,相差无异,只是多了一个textviewid,这样就意味着可以使用复杂的资源xml文件,只需要告诉
textview的id就ok了,看下面的例子。
我们在一个布局xml资源中放置一个ImageView,一个TextView,内容如下:
list_item.xml 文件
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal" >
- <ImageView
- android:id="@+id/img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_launcher"
- />
- <TextView
- android:id="@+id/tv"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- />
- </LinearLayout>
使用代码只需要更改成如下:
- private ArrayList<String> list = new ArrayList<String>();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- lv = (ListView)findViewById(R.id.listview);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(
- this,
- R.layout.list_item,
- R.id.tv,
- getData());
- lv.setAdapter(adapter);
- }
- private ArrayList<String> getData()
- {
- list.add("180平米的房子");
- list.add("一个勤劳漂亮的老婆");
- list.add("一辆宝马");
- list.add("一个强壮且永不生病的身体");
- list.add("一个喜欢的事业");
- return list;
- }
这样就实现一个带上图片+文字的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就需要继承他,然后重写里面的许多方法。
- class MyAdapter extends BaseAdapter
- {
- private Context context;
- public MyAdapter(Context context)
- {
- this.context = context;
- }
- @Override
- public int getCount() {
- // How many items are in the data set represented by this Adapter.(在此适配器中所代表的数据集中的条目数)
- return 0;
- }
- @Override
- public Object getItem(int position) {
- // Get the data item associated with the specified position in the data set.(获取数据集中与指定索引对应的数据项)
- return null;
- }
- @Override
- public long getItemId(int position) {
- // Get the row id associated with the specified position in the list.(取在列表中与指定索引对应的行id)
- return 0;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- // Get a View that displays the data at the specified position in the data set.
- return null;
- }
- }
这里面没什么难度,但是这个getView方法必须好好处理,也是最麻烦的
第一种:没有任何处理,不建议这样写。如果数据量少还可以凑合,但是如果列表项数据量很大的时候,会每次都重新创建View,设置资源,严重影响性
能,所以从一开始就不要用这种方式:
- @Override
- public View getView(int position, View convertView, ViewGroup parent)
- {
- View item = mInflater.inflate(R.layout.list_item, null);
- ImageView img = (ImageView)item.findViewById(R.id.img)
- TextView title = (TextView)item.findViewById(R.id.title);
- TextView info = (TextView)item.findViewById(R.id.info);
- img.setImageResource(R.drawable.ic_launcher);
- title.setText("Hello");
- info.setText("world");
- return item;
- }
第二种ListView优化:通过缓存convertView,这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中
的View,提升了性能:
- public View getView(int position, View convertView, ViewGroup parent)
- {
- //重点在这里面
- if(convertView == null)
- {
- convertView = mInflater.inflate(R.layout.list_item, null);
- }
- ImageView img = (ImageView)convertView.findViewById(R.id.img)
- TextView title = (TextView)convertView.findViewById(R.id.title);
- TextView info = (TextView)ConvertView.findViewById(R.id.info);
- img.setImageResource(R.drawable.ic_launcher);
- title.setText("Hello");
- info.setText("world");
- return convertView;
- }
ArrayAdapter和SimpleAdapter、BaseAdapter相关推荐
- 【Android】Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法
Android适配器之ArrayAdapter.SimpleAdapter和BaseAdapter的简单用法与有用代码片段 ArrayAdapter.SimpleAdapter和BaseAdapter ...
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
收藏ArrayAdapter.SimpleAdapter和BaseAdapter的一些简短代码片段,希望用时方便想起其用法. 1.ArrayAdapter 只可以简单的显示一行文本 代码片段: Arr ...
- (1)Adapter适配器(ArrayAdapter、SimpleAdapter、BaseAdapter)
ArrayAdapter(数组适配器) ArrayAdapter只能显示一行文本数据 ArrayAdapter(@NonNull Context context, @LayoutRes int res ...
- Android的ArrayAdapter、SimpleAdapter、BaseAdapter与ListView的使用
工程目录: MainActivity package com.example.demo_four;import androidx.appcompat.app.AppCompatActivity;imp ...
- android--(布局ListView、优化、刷新分页、ArrayAdapter、SimpleAdapter 、BaseAdapter)
ListView组件: 列表视图是Android 中最为常用的一种视图组件,它以垂直列表的方式列出 需要显示的列表项,例如:显示联系人名单.系统设置项等,都用到了ListView组件 public c ...
- 适配器AdapterView(ArrayAdapter SimpleAdapter BaseAdapter)
Android中对于适配器的理解: android开发中会大量使用到Listview 而 ListView 需要适配器才能使用,不同场合使用不同的适配器.接了下来 浅谈一下三个常用的适配器,概念及其 ...
- [安卓开发] 下拉框Spinner与适配器ArrayAdapter/SimpleAdapter的使用
目录 简单介绍Spinner和Adapter ArrayAdapter实现以对话框形式展示下拉框(纯文字) Simple实现以对话框形式展示下拉框(图片加文字) 简单介绍Spinner和Adapter ...
- Android之ArrayAdapter使用
Adapter常用的实现方式ArrayAdapter.simpleAdapter.SimpleCursorAdapter.BaseAdapter. 1.ArrayAdapter通常用于将数组或List ...
- Android: BaseAdapter 实现分页
小记记代码 列表的显示需要三个元素: 1.ListVeiw 用来展示列表的View. 2.适配器 用来把数据映射到ListView上的中介. 3.数据 具体的将被映射的字符串,图片,或者基本 ...
最新文章
- 理解python的with as 语句
- Android ViewPager
- liferay6.2 struts2 request.getparameter取值为null
- 简易 责任链的两种实现方式
- 渗透测试流程信息收集
- JQuery iframe页面通过parent方法操作父页面中的元素与方法(实例讲解)
- 如何在软件里显示编译时间
- 接口(Api)版本号命名规则
- JavaScript 通过身份证号获取出生日期、年龄、性别 、籍贯
- 74xx系列芯片类型及功能概览
- 【单片机】2.2 AT89S52的引脚功能
- GitHub上超火的“算法宝典”,程序员开发指南
- java代码合成多张图片成一张
- POI框架EXCEL解析性能优化
- 网页中使用的特殊字体(webdings, wingdings 2)续
- 数据库树形结构存储方法的选择
- 电脑开机启动时打开某个Excel表格
- linux开机自启服务
- 二进制、八进制、十进制、十六进制之间的互相转化
- Win10系统Anaconda下安装TensorFlow、Karas和PyTorch
热门文章
- 全面拥抱 K8s,ApacheDolphinScheduler 应用与支持 K8s 任务的探索
- oracle不用密码备份,oracle用备份的控制文件恢复后不用resetlogs打开方式的恢复
- 认识并使用 Promise
- Android RecyclerView数据展示
- 服务器运行aspx,aspx文件怎么打开?aspx是什么文件?
- JVM性能优化(四)提高网站访问性能之Tomcat优化
- DevExpress 16.2安装破解
- bum报文_VXLAN 简介
- PostgreSQL UPDATE 语句
- 软件测试及专业,常用软件及专业软件测试