Android(安卓)常用Adapter(ArrayAdapter ,SimpleAdapter ,BaseAdapter )的具体用法
1.Android ArrayAdapter 详解
一、简单的。
这样的列表的每一行都只有一行文字。
[java]view plaincopy
- ListViewlist=(ListView)findViewById(R.id.list);
- String[]arr={" 百色学院","android技术开发","9701"};
- 构造函数:public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
- ArrayAdapter<String>arrayAdapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item1,arr);
- list.setAdapter(arrayAdapter);//为ListView设置Adapter
-
- 第一个参数是上下文context,就是当前的Activity,一般为this, 第二个参数是android sdk中自己内置的一个布局,它里面只有一个TextView,这个参数是表明我们数组中每一条数据都一一对应显示在这个view上面;第三个参数就是我们要显示的数据。listView会根据这三个参数,遍历数据源(如数组)里面的每一条数据,读出一条,显示到第二个参数对应的布局中。
-
- 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:每个列表项都是带多单选按钮的文本。
- <LinearLayout
- android:orientation="horizontal"
- andrlod:layout_width="match_parent"
- android:layout_height="match_parent">
- <ImageView
- android:id="@+id/image"
- ......
- />
- <TextView
- android:id="@+id/title"
- .....
- />
- <LinearLayout>
二、样式丰富但内容简单的。
layout下的online_user_list_item.xml内容如下:
[xhtml] view plain copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <TextViewandroid: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>
[java] view plain copy
- 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
- publicclassUserListAdapterextendsArrayAdapter<User>{
- privateintresourceId;
- publicUserListAdapter(Contextcontext,inttextViewResourceId,List<User>objects){
- super(context,textViewResourceId,objects);
- this.resourceId=textViewResourceId;
- }
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- Useruser=getItem(position);
- LinearLayoutuserListItem=newLinearLayout(getContext());
- Stringinflater=Context.LAYOUT_INFLATER_SERVICE;
- LayoutInflatervi=(LayoutInflater)getContext().getSystemService(inflater);
- vi.inflate(resourceId,userListItem,true);
- TextViewtvUsername=(TextView)userListItem.findViewById(R.id.tv_user_list_username);
- TextViewtvAskedNum=(TextView)userListItem.findViewById(R.id.tv_user_list_askednum);
- TextViewtvLastMsg=(TextView)userListItem.findViewById(R.id.tv_user_list_lastmsg);
- tvUsername.setText(user.getUsername());
- tvAskedNum.setText(String.valueOf(user.getAskedNum()));
- tvLastMsg.setText(user.getLastMsg());
- returnuserListItem;
- }
- }
activity里就这样写
[java] view plain copy
- List<User>users=newArrayList<User>();
- Useruser=newUser();
- user.setAskedNum(8);
- user.setLastMsg("hello");
- user.setUsername("pxx");
- users.add(user);
- users.add(user);
- users.add(user);
- UserListAdapteradapter=newUserListAdapter(this,R.layout.online_user_list_item,users);
- listview.setAdapter(adapter);
2.Android SimpleAdapter 详解
[java] view plain copy
- listViewlistview=(ListView)findViewById(R.id.listView1);
- int[]imageId=newint[]{R.drawable.imag0,R.drawable.imag1,R.drawable.imag2};
- String[]title=newString[]{"百色学院","android技术开发","电气13班"};
- List<Map<String,Object>>listItems=newArrayList<Map<String,Object>>();//创建一个List集合
- for(inti=0;i<imageld.length;i++){//遍历数组
- Map<String,Object>map=newHashMap<String,Object>();//创建哈希表
- map.put("image",imageId[i]);
- map.put("title",title[i]);
- listItems.add(map);}
- SimpleAdapteradapter=newSimpleAdapter(this,listItems,R.layout.items,newString[]{"title","image"},new
- int[]{"R.id.title","R.id.image"});
- listView.setAdapter(adapter);
- 构造参数:
- 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- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns: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"
- />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- >
- <TextView
- android:id="@+id/tv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- />
- <TextView
- android:id="@+id/info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="14sp"
- />
- </LinearLayout>
- </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- packagecom.demo;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.Map;
- importandroid.app.Activity;
- importandroid.content.Context;
- importandroid.os.Bundle;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.ImageView;
- importandroid.widget.ListView;
- importandroid.widget.TextView;
- publicclassDemoActivityextendsActivity{
- privateListViewlv;
- privateList<Map<String,Object>>data;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- lv=(ListView)findViewById(R.id.lv);
- //获取将要绑定的数据设置到data中
- data=getData();
- MyAdapteradapter=newMyAdapter(this);
- lv.setAdapter(adapter);
- }
- privateList<Map<String,Object>>getData()
- {
- List<Map<String,Object>>list=newArrayList<Map<String,Object>>();
- Map<String,Object>map;
- for(inti=0;i<10;i++)
- {
- map=newHashMap<String,Object>();
- map.put("img",R.drawable.ic_launcher);
- map.put("title","android");
- map.put("info","自定义adaper...");
- list.add(map);
- }
- returnlist;
- }
- //ViewHolder静态类
- staticclassViewHolder
- {
- publicImageViewimg;
- publicTextViewtitle;
- publicTextViewinfo;
- }
- publicclassMyAdapterextendsBaseAdapter
- {
- privateLayoutInflatermInflater=null;
- privateMyAdapter(Contextcontext)
- {
- //根据context上下文加载布局,这里的是Demo17Activity本身,即this
- this.mInflater=LayoutInflater.from(context);
- }
- @Override
- publicintgetCount(){
- //在此适配器中所代表的数据集中的条目数
- returndata.size();
- }
- @Override
- publicObjectgetItem(intposition){
- //获取数据集中与指定索引对应的数据项
- returnposition;
- }
- @Override
- publiclonggetItemId(intposition){
- //获取在列表中与指定索引对应的行id
- returnposition;
- }
- //获取一个在数据集中指定索引的视图来显示数据
- @Override
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ViewHolderholder=null;
- //如果缓存convertView为空,则需要创建View
- if(convertView==null)
- {
- holder=newViewHolder();
- //根据自定义的Item布局加载布局
- convertView=mInflater.inflate(R.layout.list_item,null);
- holder.img=(ImageView)convertView.findViewById(R.id.img);
- holder.title=(TextView)convertView.findViewById(R.id.tv);
- holder.info=(TextView)convertView.findViewById(R.id.info);
- //将设置好的布局保存到缓存中,并将其设置在Tag里,以便后面方便取出Tag
- convertView.setTag(holder);
- }else
- {
- holder=(ViewHolder)convertView.getTag();
- }
- holder.img.setBackgroundResource((Integer)data.get(position).get("img"));
- holder.title.setText((String)data.get(position).get("title"));
- holder.info.setText((String)data.get(position).get("info"));
- returnconvertView;
- }
- }
- }
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- android关于获取摄像头帧数据转成图片
- Android学习笔记----HttpURLConnection 和 HttpClient(已经被废
- Android小程序之音乐播放列表
- Android(安卓)AsyncTaskLoader需要注意的问题
- Android数据存储(3)SQLite简介和简单的登录与注册源代码
- Settings 界面修改