Android ListView几种Adapter用法简介

Android ListView使用简介

ListViewAndroid软件开发中十分常用也十分重要的一个UI控件。ListView的每一个子项可以是一个简单的字符串,也可以是一组View的组合,开发者完全可以根据自己的需求来定义显示的形式。

如何使用一个ListView实现对数据的显示呢?

1. 创建ListView控件,已备数据显示

2. 准备要显示的数据

3. ListView构建一个数据适配器(Adapter)

4. 绑定适配器

5. 处理ListView操作回调,完成业务功能

 

如何创建ListView

我们可以直接使用xml格式的布局(layout)文件来创建一个ListView,如果我们已经有一个布局(layout)文件,直接添加ListView控件。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:tools="http://schemas.android.com/tools"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             tools:context=".MainActivity">
    <ListView
        android:id="@+id/id_listview_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

然后再Activity中去获取该控件,这样就可以使用该控件了。

当然,我们也可以直接用代码创建一个ListView控件,并把该控件作为要显示的View,或者添加到现有的一个groupview控件中去。

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    ListView myListView = new ListView(this);
    setContentView(myListView);
}

一般建议在布局(layout)文件中进行UI控件的定义。

 

如何创建一个适配器?

在这几个步骤中,构建数据适配器是很重要的一个环节,同样也是比较复杂的一个环节。ListView常用的适配器(Adapter)有以下几种。

Adapter

含义

ArrayAdapter<T>

用来绑定一个数组,支持泛型操作

SimpleAdapter

用来绑定在xml中定义的控件对应的数据

SimpleCursorAdapter

用来绑定游标得到的数据

BaseAdapter

通用的基础适配器

 

  • 使用ArrayAdapter绑定数据

1. 准备数据

private static final String[] strDatas = new String[] {
    "first", "second", "third", "fourth", "fifth"
    };

2. 直接绑定

ListView lv = (ListView) findViewById(R.id.id_listview_list);
lv.setAdapter(new ArrayAdapter<String>(this,
        android.R.layout.simple_list_item_1, strDatas));

此处使用了Android系统自带的一个列表Item样式,显示效果如下图:


使用ArrayAdapter绑定数据适用数据特别简单的情况。


  • 使用SimpleAdapter绑定数据

1.创建列表Item样式布局文件simple_adapter_item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/sai_id"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:paddingBottom="5dp"
        android:textSize="18dp"
        android:layout_weight="1"
        android:textColor="#000"
        />
    <TextView
        android:id="@+id/sai_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="18dp"
        android:layout_weight="3"
        android:textColor="#000"
        />
    <TextView
        android:id="@+id/sai_phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:textSize="18dp"
        android:layout_weight="4"
        android:textColor="#000"
        />

</LinearLayout>

2.准备数据

List<Map<String,Object>> data=new ArrayList<Map<String,Object>>();
Map<String,Object> map1=new HashMap<String, Object>();
map1.put("id", "001");
map1.put("name", "张三");
map1.put("phone", "13588551201");

Map<String,Object> map2=new HashMap<String, Object>();
map2.put("id", "002");
map2.put("name", "李四");
map2.put("phone", "13588551202");

Map<String,Object> map3=new HashMap<String, Object>();
map3.put("id", "003");
map3.put("name", "张二虎");
map3.put("phone", "13588551203");

Map<String,Object> map4=new HashMap<String, Object>();
map4.put("id", "004");
map4.put("name", "李老大");
map4.put("phone", "13588551204");

Map<String,Object> map5=new HashMap<String, Object>();
map5.put("id", "005");
map5.put("name", "王老二");
map5.put("phone", "13588551205");

data.add(map1);
data.add(map2);
data.add(map3);
data.add(map4);
data.add(map5);

3.绑定适配器

ListView lv = (ListView) findViewById(R.id.id_listview_list);
         lv.setAdapter(new SimpleAdapter(this,
        	data, R.layout.simple_adapter_item,
        	new String[]{"id","name","phone"},
        	new int[]{R.id.sai_id,R.id.sai_name, R.id.sai_phone}));

显示效果如下:

 

  • 使用SimpleCursorAdapter绑定数据

1.此示例中列表Item样式布局文件直接复用上个例子中的布局文件simple_adapter_item.xml

2.准备数据

一般情况下Cursor都是通过查找数据获取到的,此处我们的重点是看如何用在SimpleCursorAdapter中来绑定到ListView中,因此我们使用可以直接示例化并可以直接插入数据的MatrixCursor类完成数据提供任务。代码如下:

String[] tableCursor = new String[] { "_id", "name", "phone" };
MatrixCursor cursor = new MatrixCursor(tableCursor);
cursor.addRow(new Object[]{"100", "张大", "13588551201" });
cursor.addRow(new Object[]{"101", "张二", "13588551202" });
cursor.addRow(new Object[]{"102", "张三", "13588551203" });
cursor.addRow(new Object[]{"103", "张四", "13588551204" });
cursor.addRow(new Object[]{"104", "张五", "13588551205" });

与上一个例子的数据几乎一样,有没有发现,此处简单了很多呢?哈哈!不过需要注意的是,作为SimpleCursorAdapter的Cursor必需要有"_id"列,否则会报错。

3.数据绑定

ListView lv = (ListView)findViewById(R.id.id_simplecursordapter_list);
lv.setAdapter(new SimpleCursorAdapter(this,
R.layout.simple_adapter_item, cursor, tableCursor, new int[]{R.id.sai_id,R.id.sai_name, R.id.sai_phone}));

运行效果如下,是不是和上面一个例子效果一样啊!

 

  • 使用BaseAdapter绑定数据

OK, 此处其实才是ListView用的最多的适配器实现方式,一般都是通过继承BaseAdapter类并重写父类的一些方法来完成ListView数据的绑定。继承BaseAdapter的类必需实现以下几个接口函数:

public int getCount(); //获取适配器中数据集中数据的条目数
public Object getItem(int i);//获取数据集中与指定索引对应的数据项
public long getItemId(int i);//获取数据集中指定索引对应的项的id
public View getView(int i, View view, ViewGroup viewGroup);//获取指定索引的列表Item的view

下面,还是使用与上面两个例子相同的列表布局及类似数据来实现列表的数据绑定实现。

1.建立数据类

public class Data {
    public Data(String i, String n, String p){
        id = i;
        name = n;
        phone = p;
    }
    public String id;
    public String name;
    public String phone;
}

2.继承BaseAdapter实现我们自己的适配器

public class MyAdapter extends BaseAdapter {
    private List<Data> mDatas = null;
    private Context mContext = null;

    public MyAdapter(Context context, List<Data> datas){
        mDatas = datas;
        mContext = context;
    }
    @Override
    public int getCount() {
        return mDatas.size();
    }

    @Override
    public Object getItem(int i) {
        return mDatas.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        ViewHolder vh;
        if (view == null){
            vh = new ViewHolder();
            view = LayoutInflater.from(mContext).inflate(R.layout.simple_adapter_item, null);
            vh.id = (TextView)view.findViewById(R.id.sai_id);
            vh.name = (TextView)view.findViewById(R.id.sai_name);
            vh.phone = (TextView)view.findViewById(R.id.sai_phone);
            view.setTag(vh);
        } else {
            vh = (ViewHolder)view.getTag();
        }
        vh.id.setText(mDatas.get(i).id);
        vh.name.setText(mDatas.get(i).name);
        vh.phone.setText(mDatas.get(i).phone);

        return view;
    }

    public final class ViewHolder
    {
        public TextView id;
        public TextView name;
        public TextView phone;
    }
}

适配其中使用了ViewHolder来提升ListView的绘制效率,通过使用ViewHolderListViewItem就可以复用View,而不用每次都去新建一个View。关于此方面知识,可以参考相关文章,此处的示例代码采用比较常用的实现方式,目的也是让大家从一开始认识他的时候就建立几个好的初印象,避免误导了读者。

3.准备数据并绑定到ListView

List<Data> datas = new ArrayList<Data>();
Data data1 = new Data("111", "老周1", "13656461200");
Data data2 = new Data("112", "老周2", "13656461201");
Data data3 = new Data("113", "老周3", "13656461202");
Data data4 = new Data("114", "老周4", "13656461203");
Data data5 = new Data("115", "老周5", "13656461204");
Data data6 = new Data("116", "老周6", "13656461205");
datas.add(data1);
datas.add(data2);
datas.add(data3);
datas.add(data4);
datas.add(data5);
datas.add(data6);<pre name="code" class="java">MyAdapter adapter = new MyAdapter(this, datas);

ListView lv = (ListView)findViewById(R.id.id_baseadapter_list);
lv.setAdapter(adapter);

此处数据的获取略显笨拙,但在实际的项目中,一般都是从数据库获取数据,或者是像文件浏览器直接获取系统文件信息。

显示效果还是与上面类似的鸟样:

 

 

OK,上面介绍了四种ListViewAdapter来实现ListView的数据绑定,我们来做一个简单的比较。

ArrayAdapter<T>     适合非常简单的数据显示,很方便,很简单。

SimpleAdapter       可以自定义Item布局,用于显示交简单的布局及控件,但布局内的控件如按钮等无法获取到焦点,当然也就无法获取到他们的点击事件。

SimpleCursorAdapter  与SimpleAdapter相似,只是他的数据源是Cursor类型而已。

BaseAdpter子类      最常用的ListView数据适配器,通过继承BaseAdpter可以较灵活的实现数据的绑定,同时通过使用ViewHolder等可以很好的提高ListView的绘制效率。另一个很重要的原因,BaseAdpter类适配器绑定的Item布局中的子控件可以获取到触摸焦点,也就是说,通过这种方式,我们可以获取Item布局中一些对象的点击,长按,check等方法。

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
转载请标明出处: 一片枫叶的专栏 文本我们将讲解android studio打包apk,aar,jar包的相关知识。apk包就是android系统的安装包,这里没什么好说的,aar包是android中独有的类库包,而jar包是java中特有的类库包,在具体的介绍打包之前,我们先来aar包和jar包的区别。 jar包与aar包的区别 jar是java字节码文件(class文件)的归档文件,其不包含android中的资源文件等信息; aar是android中特有的归档文件,既包含字节码文件也包含android
欢迎转载,转载请注明出处: http://blog.csdn.net/dmk877/article/details/51980734 在上一篇文章中,我们详细讨论了Tween动画的xml的实现以及interpolator的使用,相信通过上篇文章大家对Tween动画的xml属性的配置会有一个详细的理解,当然这篇文章也是承接上篇文章,所以强烈建议先阅读上篇文章: Android开发之Tween(补间动画)完全解析(上) ,这篇文章将从代码的角度实现上篇文章的效果。 如有疑问请留言,如有谬误欢迎批评指正。 Tw

Android闹钟设置的解决方案 - 2016-07-25 14:07:00

Android设置闹钟并不像IOS那样这么简单,做过Android设置闹钟的开发者都知道里面的坑有多深。下面记录一下,我解决Android闹钟设置的解决方案。 主要问题 API19开始AlarmManager的机制修改。 应用程序被Kill掉后,设置的闹钟不响。 6.0以上进入Doze模式会使JobScheduler停止工作。 手机设置重启后,闹钟失效问题。 API19以上AlarmManager机制的修改 API19之前AlarmManager提供了三个设置闹钟的方法,由于业务需求闹钟只需要一次性,所以
start_kernel之前的汇编代码建立了内核临时页表,完成了内核区域的静态线性映射,保证内核可以在舒适的虚拟地址空间(运行地址和链接地址一致)运行。进入start_kernel之后就要准备建立完整的页表映射,这部分工作是在paging_init中完成。 不过在建立完整页表映射之前还需要进行一些准备工作,本文来分析下。 为了简化整个代码流程,便于分析,我的设备内核配置为不使用高端内存,不配置CONFIG_HIGHMEM。bootargs中传给内核的mem=256. 内核版本号:3.4.55 paging

App的打磨之路(下) - 2016-07-25 14:07:48

前言:该文接上两篇博文 App的打磨之路(上) 和 App的打磨之路(中) ,继续描述打包、反编译及加固。 一、打包 每个Android应用在完成后都需要打成APK包,对于单个打包的方式在此就不赘述了,基本IDE都带,只是在对外发布的应用需要配置属于该应用的唯一签名,下文主要讲述需要上传多个市场的情况下怎么批量打包。 1、Maven打包 Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一

PendingIntent的内部机制 - 2016-07-25 14:07:48

摘自;http://my.oschina.net/youranhongcha/blog/196933   1 概述         在Android中,我们常常使用PendingIntent来表达一种“留待日后处理”的意思。从这个角度来说,PendingIntent可以被理解为一种特殊的异步处理机制。不过,单就命名而言,PendingIntent其实具有一定误导性,因为它既不继承于Intent,也不包含Intent,它的核心可以粗略地汇总成四个字——“异步激发”。         很明显,这种异步激发常常
Android framework提供了许多标准的工具,来创建有吸引力的、功能丰富的用户图形界面。但是,如果你想要更多的控制权,比如在应用程序的屏幕上绘图,或者冒险进入三维图形,你需要使用不同的工具。通过Android framework提供的OpenGL ES的API提供了一套显示高端的工具,动画图像超出你的想象,许多Android设备的图像处理单元得到了加速(GPUs)。 这节课主要开发一个OpenGL应用程序、包括设置、画对象、移动对象元素、响应触摸输入事件。 这节课的示例代码使用的是OpenGL

来仿一仿retrofit - 2016-07-25 14:07:32

为什么要重复造轮子 在开发领域有一句很流行的话就是 不要重复造轮子 , 因为我们在开发中用到的很多东西早已有很多人去实现了, 而且这些实现都是经过时间和开发者检验过的, 一般不会遇到什么坑, 而如果我们自己去实现的话, 那不仅会增加工作量, 最大的隐患还是我们并不能预见以后是否会遇到大坑. 不过大家注意了吗. 上面 不要重复造轮子 的一个前提是 开发中 , 是的, 这句名言在开发中是适用的, 那在学习阶段的? 我可以大概的告诉你- 忘记这句话! , 为什么 不要重复造轮子 不适合在学习阶段使用呢? 如果我
背景 前面一篇总结了Serializable的序列化与反序列化,现在接着总结XML。主要内容:XML基本的序列化与反序列化方法、一些注意事项、以及自定义了一个XML注解框架(简洁代码,解放双手)。 XML的序列化与反序列化 先与Serializable进行简单的对比: Serializable存储的文件,打开后无法正常查看,安全性高。xml文件可通过文本编辑器查看与编辑,可读性高(浏览器会格式化xml文件,更方便查看),安全性低; Serializable文件通过了签名,只能在自己的程序中反序列化,或RM
每日更新关注 : http://weibo.com/hanjunqiang   新浪微博! iOS 开发者交流QQ群 : 446310206   有问题或技术交流可以咨询! 欢迎加入 ! 这篇直接搬了一份官方文档过来看的 由于之前没用markdown搞的乱七八糟的 所以重新做了一份 后面看到官网的中文文档更新不及时看着英文翻译了一点 搞的更乱了 :( 英文好的直接点右边- 官方OC文档 Realm 是一个移动端的数据库, Realm 是 SQLite 和 CoreData 的替代者。它可以节省你成千上万行