Android 常用Adapter(ArrayAdapter ,SimpleAdapter ,BaseAdapter )的具体用法
来源:互联网 发布:复旦博士后待遇 知乎 编辑:程序博客网 时间:2024/05/08 21:02
转载请备注出自于:http://blog.csdn.net/qq_22118507/article/details/51407568
1.Android ArrayAdapter 详解
一、简单的。
这样的列表的每一行都只有一行文字。
- ListView list = (ListView)findViewById(R.id.list);
- String []arr = {" 百色学院","android技术开发","9701"};
- 构造函数:public ArrayAdapter (Context context, int textViewResourceId, T[] objects)
- ArrayAdapter <String>arrayAdapter = new ArrayAdapter<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:TextViewsimple_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内容如下:
- <?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>
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.online_user_list_item, R.id.online_user_list_item_textview);
如果我们需要展示的内容是一仅一个textview承载不了的,还需要其它组件,怎么办?我们可以自定义。
三、内容丰富的(自定义ArrayAdapter)。
这就需要写一个类继承自ArrayAdapter并且重写getView方法。上代码:
- public class UserListAdapter extends ArrayAdapter<User> {
- private int resourceId;
- public UserListAdapter(Context context, int textViewResourceId, List<User> objects) {
- super(context, textViewResourceId, objects);
- this.resourceId = textViewResourceId;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent){
- User user = getItem(position);
- LinearLayout userListItem = new LinearLayout(getContext());
- String inflater = Context.LAYOUT_INFLATER_SERVICE;
- LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater);
- vi.inflate(resourceId, userListItem, true);
- TextView tvUsername = (TextView)userListItem.findViewById(R.id.tv_user_list_username);
- TextView tvAskedNum = (TextView)userListItem.findViewById(R.id.tv_user_list_askednum);
- TextView tvLastMsg = (TextView)userListItem.findViewById(R.id.tv_user_list_lastmsg);
- tvUsername.setText(user.getUsername());
- tvAskedNum.setText(String.valueOf(user.getAskedNum()));
- tvLastMsg.setText(user.getLastMsg());
- return userListItem;
- }
- }
activity里就这样写
- List<User> users = new ArrayList<User>();
- User user = new User();
- user.setAskedNum(8);
- user.setLastMsg("hello");
- user.setUsername("pxx");
- users.add(user);
- users.add(user);
- users.add(user);
- UserListAdapter adapter = new UserListAdapter(this,R.layout.online_user_list_item,users);
- listview.setAdapter(adapter);
- listView listview = (ListView)findViewById(R.id.listView1);
- int[] imageId = new int[]{R.drawable.imag0,R.drawable.imag1,R.drawable.imag2};
- String[] title = new String[]{"百色学院","android技术开发","电气13班"};
- List<Map<String,Object>>listItems = new ArrayList<Map<String,Object>>();//创建一个List集合
- for(int i=0;i<imageld.length;i++){//遍历数组
- Map<String,Object>map = new HashMap<String,Object>();//创建哈希表
- map.put("image",imageId[i]);
- map.put("title",title[i]);
- listItems.add(map);}
- SimpleAdapter adapter = new SimpleAdapter(this,listItems,R.layout.items,new String[]{"title","image"},new
- int[]{"R.id.title","R.id.image"});
- listView.setAdapter(adapter);
- 构造参数:
- SimpleAdapter(Context context, 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
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"
- />
- <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
- package com.demo;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.content.Context;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.TextView;
- public class DemoActivity extends Activity {
- private ListView lv;
- private List<Map<String, Object>> data;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- lv = (ListView)findViewById(R.id.lv);
- //获取将要绑定的数据设置到data中
- data = getData();
- MyAdapter adapter = new MyAdapter(this);
- lv.setAdapter(adapter);
- }
- private List<Map<String, Object>> getData()
- {
- List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
- Map<String, Object> map;
- for(int i=0;i<10;i++)
- {
- map = new HashMap<String, Object>();
- map.put("img", R.drawable.ic_launcher);
- map.put("title", "android");
- map.put("info", "自定义adaper...");
- list.add(map);
- }
- return list;
- }
- //ViewHolder静态类
- static class ViewHolder
- {
- public ImageView img;
- public TextView title;
- public TextView info;
- }
- public class MyAdapter extends BaseAdapter
- {
- private LayoutInflater mInflater = null;
- private MyAdapter(Context context)
- {
- //根据context上下文加载布局,这里的是Demo17Activity本身,即this
- this.mInflater = LayoutInflater.from(context);
- }
- @Override
- public int getCount() {
- //在此适配器中所代表的数据集中的条目数
- return data.size();
- }
- @Override
- public Object getItem(int position) {
- //获取数据集中与指定索引对应的数据项
- return position;
- }
- @Override
- public long getItemId(int position) {
- //获取在列表中与指定索引对应的行id
- return position;
- }
- //获取一个在数据集中指定索引的视图来显示数据
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder = null;
- //如果缓存convertView为空,则需要创建View
- if(convertView == null)
- {
- holder = new ViewHolder();
- //根据自定义的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"));
- return convertView;
- }
- }
- }
- Android 常用Adapter(ArrayAdapter ,SimpleAdapter ,BaseAdapter )的具体用法
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法
- [Android] Adapter:SimpleAdapter SimpleCursorAdapter ArrayAdapter 与ListView的用法
- android中的适配器(ArrayAdapter,SimpleAdapter,BaseAdapter)
- Android Adapter接口及实现类之ArrayAdapter、SimpleAdapter和BaseAdapter的简单介绍及运用
- Adapter汇总(ArrayAdapter,SimpleAdapter,BaseAdapter 简单入门)
- android Adapter综合使用(ArrayAdapter、SimpleAdapter、BaseAdapter在ListView和GridView中的使用)
- android---------ArrayAdapter、SimpleAdapter和BaseAdapter
- android-----ArrayAdapter、SimpleAdapter和BaseAdapter
- GridView && ArrayAdapter && SimpleAdapter && BaseAdapter【Android】
- 【Android】Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段
- Android适配器之ArrayAdapter、SimpleAdapter和BaseAdapter的简单用法与有用代码片段 .
- 4 流程控制(if的用法)
- 联发科Linkit 7688 DUO(三): 通过 Arduino 控制外设和传感器
- ios开发UI系列之使用AutoLayout的几个经典的布局技巧
- Spring MVC 概述
- C++primer知识点(二)
- Android 常用Adapter(ArrayAdapter ,SimpleAdapter ,BaseAdapter )的具体用法
- 《 常见算法与数据结构》符号表ST(4)——二叉查找树删除 (附动画)
- 聊聊同步、异步、阻塞与非阻塞
- 基于OpenCV的火焰检测(一)——图像预处理
- C++primer知识点(三)
- 深入理解JVM03--垃圾收集算法(“标记-清除”,“复制”,“标记-整理”,“分代收集”)
- Java多线程和并发基础面试问答
- 2016"百度之星" - 资格赛(Astar Round1)Problem C
- strcmp 函数