Android ListView几种Adapter用法简介「建议收藏」

Android ListView几种Adapter用法简介「建议收藏」ArrayAdapter适合非常简单的数据显示,很方便,很简单。SimpleAdapter可以自定义Item布局,用于显示交简单的布局及控件,但布局内的控件如按钮等无法获取到焦点,当然也就无法获取到他们的点击事件。SimpleCursorAdapter与SimpleAdapter相似,只是他的数据源是Cursor类型而已。BaseAdpter子类最常用的ListView数据适配器,通过继承BaseAdpter可以较灵活的实现数据的绑定,同时通过使用View

大家好,又见面了,我是你们的朋友全栈君。

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样式,显示效果如下图:

Android ListView几种Adapter用法简介「建议收藏」

使用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}));

显示效果如下:

 Android ListView几种Adapter用法简介「建议收藏」

  • 使用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}));

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

 Android ListView几种Adapter用法简介「建议收藏」

  • 使用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);


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

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

 Android ListView几种Adapter用法简介「建议收藏」

 

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163288.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月22日 上午6:00
下一篇 2022年7月22日 上午6:16


相关推荐

  • Python zipfile简介「建议收藏」

    Python zipfile简介「建议收藏」从简单的角度来看的话,zip格式会是个不错的选择,而且python对zip格式的支持够简单,够好用。1)简单应用如果你仅仅是希望用python来做压缩和解压缩,那么就不用去翻文档了,这里提供一个简单的用法,让你一看就能明白。importzipfilef=zipfile.ZipFile(‘filename.zip’,’w’,zipfile.ZIP_DEFLATED)f.write(…

    2025年12月4日
    5
  • mysql中not exists用法_not exists用法

    mysql中not exists用法_not exists用法notexists是sql中的一个语法,常用在子查询和主查询之间,用于条件判断,根据一个条件返回一个布尔值,从而来确定下一步操作如何进行,notexists也是exists或in的对立面。notexists是exists的对立面,所以要了解notexists的用法,我们首先了解下exists、in的区别和特点:exists:强调的是是否返回结果集,不要求知道返回什么,比如:sele…

    2022年7月15日
    15
  • 创建线程:pthread_create

    创建线程:pthread_create

    2022年3月2日
    50
  • C语言大数运算-大数运算库篇

    C语言大数运算-大数运算库篇前言 通过前面的 3 篇文章我们已经实现了大数的四则运算 本篇博客我们会把这是几个个方法做成一个库文件 可以供自己日后使用 细心的读者可能意到了 每个程序都引用了 big h 但是都被注释掉了 big h 就是头文件只要将函数的声明放到该文件中 然后在其它程序中引用该文件就可以使用大数运算的方法 重复的代码我就不再写了 其实有了算法你们自己就可以实现 所以我就简单的说几句 文件命名 头文件 b

    2026年3月17日
    2
  • PageRank算法C++代码实现标准版

    对于PageRank算法,维基百科和网上很多大牛的博客已经讲得很详细了,这里附上一个自己写的PageRank算法C++实现版本

    2022年4月7日
    56
  • 用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程

    用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程C语言简单实现学生成绩管理系统一、前言首先,要写一个管理系统必须要先搭出一个框架来,即明确自己要实现哪些功能,将每个功能都写陈一个函数,然后再去编写实现各个功能的函数,最后再思考各个函数之间的相互调用。如果没有先搭好框架,而是直接一上手就去写代码的话,写着写着就会有种无从下手的感觉,就像你要做一道编程题目一样,首先要做的肯定是去读题目,看题目想要让我们干什么,然后才会去写代码。其次,最…

    2025年12月7日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号