25. 【Android教程】列表控件 ListView

这篇具有很好参考价值的文章主要介绍了25. 【Android教程】列表控件 ListView。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在学习了 ScrollView 及 Adapter 两节内容之后,大家应该对 ListView 有了一些基本的了解,它是一个列表样式的 ViewGroup,将若干 item 按行排列。ListView 是一个很基本的控件也是 Android 中最重要的控件之一。它可以帮助我们完成多个 View 的垂直排列并支持滚动显示效果,而它比 ScrollView 更灵活也更易扩展,Adapter 作为 UI 控件和数据源之间的桥梁,会帮我们实现 MVC 模式,所以在实际开发中大多数的列表场景我们会优先考虑使用 ListView 来实现(目前 Google 推出了新的更强大的列表控件——RecyclerView,不过基本原理和 ListView 类似)。

1. ListView 的特性

ListView 在 Android App 中无处不在,比如最常用的“联系人”就可以通过 ListView 轻松实现。通过 ListView 用户可以上下滑动来浏览列表信息,我们可以在 ListView 中放置各种控件,比如 ImageView、Button、ToggleButton 等来丰富我们的列表样式。

正因为 ListView 通常是用来展示大量的数据集的控件,所以我们不可能挨个的为每个 item 去设置相应的数据,这时候就要借助 Adapter 来帮助我们完成 UI 控件和数据的绑定工作了。

2. ListView 的基本用法

ListView 相比其他控件来讲确实比较特殊,也有很多使用技巧,但是它作为一个 ViewGroup,同样也有自己的布局属性、 API 及事件监听器。

2.1 ListView 的常用属性

  • divider:
    设置 item 之间的分隔线,可以设置成颜色,也可以设置成 drawable 资源。
  • dividerHeight:
    设置分隔线的高度;
  • footerDividersEnabled:
    是否在 footerView(表尾)前绘制一个分隔线,默认为 true;
  • headerDividersEnabled:
    是否在 headerView(表首)前绘制一个分隔线,默认为 true;
  • android:scrollbars:
    设置滚动条样式,有两种样式: horizontal 和 vertical,以及 none 表示隐藏滚动条。

2.2 ListView 的常用 API

  • addHeaderView(View v):
    添加 headView,headView 会固定显示在表的第一个元素之前。参数是一个 View 对象,比如可以用作“下拉刷新”的 View;
  • addFooterView(View v):
    添加 footerView,footerView 会固定显示在表的最后一个元素之后。参数是一个 View 对象,比如可以用作“上拉加载更多”的 View;
  • addHeaderView(View v, Object data, boolean isSelectable):
    添加 headView,第二个参数表示与 headView 绑定的数据对象,第三个参数表示当前这条 item 是否可选中,通常“下拉刷新”可以设置成无法选中;
  • addFooterView(View v, Object data, boolean isSelectable):
    添加 footerView,第二个参数表示与 footerView 绑定的数据对象,第三个参数表示当前这条 item 是否可选中,通常“上拉加载更多”可设置成无法选中。

2.3 点击事件监听器

ListView 的样式示意图如下:

25. 【Android教程】列表控件 ListView,Android 入门教程,android

ListView 中的每个 item 可以设置成任意样式,可以包含任意的 Android 控件,非常灵活。接下来,我们来一起看看如何使用。

3. ListView 的使用示例

使用 ListView 就一定逃不开 Adapter,在上一节我们介绍了 ArrayAdapter 和 SimpleAdapter 配合 ListView 的使用方法,其实 ArrayAdapter 和 SimpleAdapter 都是继承 BaseAdapter 做的封装,那么这一节我们就来看看 BaseAdapter 究竟是何方神圣。为了让大家更好的看到对比,这一节我们用 BaseAdapter 来实现上一节的水果的列表。

3.1 自定义 Adapter

BaseAdapter 是一个接口,我们自定义 Adapter 就需要实现一个 BaseAdapter 接口,首先创建一个 MyAdapter 类实现 BaseAdapter 接口,如下:

package com.emercy.myapplication;

import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

public class MyAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return null;
    }
}

可以看到,继承自 BaseAdapter 的类有 4 个方法是必须实现的,我们具体看看这四个方法分别表示什么以及如何实现:

  • public int getCount():
    返回列表的长度,即 ListView 需要展示的 item 数量。通常我们会将数据保存在 List 或者数组当中,从而可以通过数据或者 list 获取列表的长度返回即可。比如如果我们通过 ArrayList 保存列表的数据,那么我们可以通过 List 的 size() 方法获取列表的长度,并在 getCount() 回调方法中返回,如下:
    @Override
    public int getCount() {
      int count = arrayList.size();     // 计算数据 ArrayList 的长度
      return count;                     // 返回列表的长度
    }
    
  • public Object getItem(int position):
    获取位于 position 的 item 对应的数据内容,当 ListView 需要填充第 position 个 item 的时候会回调此函数获取当前 item 上应该显示的数据内容,如果数据存在 ArrayList 当中,直接返回当前 position 的 ArrayList 内容即可,如下:
    @Override
    public Object getItem(int i):
      return arrayList.get(i);        // item 对应的数据内容
    }
    
  • public long getItemId(int position) :
    返回当前行的 itemid,itemid 是唯一标识当前 item 的索引,通常情况下我们可以直接返回 position,如下:
    @Override
    public long getItemId(int i) {
      return i;
    }
    
  • public View getView(int position, View convertView, ViewGroup parent):
    当列表中的一个 item 即将被展示的时候系统会回调此函数,我们需要在此回调接口中完成数据与 UI 控件的绑定。通过LayoutInflater类获取布局对象,然后通过findViewById拿到具体的控件,并将数据内容设置到控件当中,比如我们需要在列表中设置一个图片资源:
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
      view = inflter.inflate(R.layout.activity_gridview, null);      // 获取布局对象
      ImageView icon = (ImageView) view.findViewById(R.id.icon);     // 通过ID拿到具体的View对象
      icon.setImageResource(flags[i]);                               // 设置ImageView的图片资源
      return view;
    }
    

3.2 编写布局文件

为了对比学习,本例实现一个和上一节中 SimpleAdapter 的水果列表相同的例子,布局文件可直接引用,具体代码可以参考 第 23 节第 2 小节的内容。

3.3 创建数据模型

在 Adapter 中创建我们需要保存的数据,和上一节的例子一样,我们用两个数组分别保存水果名称和水果图片资源:

String[] mDataName = {"苹果", "梨", "香蕉", "桃子", "西瓜", "荔枝", "橘子"};
int[] mDataImage = {R.drawable.apple, R.drawable.pear, R.drawable.banana, R.drawable.peach,
            R.drawable.watermelon, R.drawable.lychee, R.drawable.orange, R.drawable.orange};

在 MyAdapter 中新增数据更新接口,用于初始数据的设置及后续数据的更新:
MyAdapter.java

public void setData(String[] name, int[] resId)

这样一来我们就有了数据源,接着按照 第 24 节 3.1 小节中对 4 个回调接口的描述修改回调方法体。主要是在getCount中返回数组长度,getView中通过 layout 对象获取到 TextView 和 ImageView,然后设置水果名称和图片,最终 MyAdapter 类的代码如下:

package com.emercy.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter {

    private Context mContext;
    private String[] mName;
    private int[] mResId;

    public MyAdapter(Context context) {
        mContext = context;
    }

    public void setData(String[] name, int[] resId) {
        mName = name;
        mResId = resId;
    }


    @Override
    public int getCount() {
        return mName.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = LayoutInflater.from(mContext).inflate(R.layout.list_view, null);
        TextView name = convertView.findViewById(R.id.textView);
        ImageView image = convertView.findViewById(R.id.imageView);
        name.setText(mName[position]);
        image.setImageResource(mResId[position]);
        return convertView;
    }
}

3.4 编写主 Activity

ListView 的核心适配逻辑都在 Adapter 中完成,主 Activity 比较简单,主要做以下几件事:

  • 获取 listView 对象
  • 创建自定义 adapter,即 MyAdapter,并设置数据
  • 将自定义 Adapter 设置给 ListView
  • 设置 ListView 列表项的点击事件
    代码如下:
package com.emercy.myapplication;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

    ListView mListView;
    String[] mDataName = {"苹果", "梨", "香蕉", "桃子", "西瓜", "荔枝", "橘子"};
    int[] mDataImage = {R.drawable.apple, R.drawable.pear, R.drawable.banana, R.drawable.peach,
            R.drawable.watermelon, R.drawable.lychee, R.drawable.orange, R.drawable.orange};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = findViewById(R.id.listView);

        MyAdapter adapter = new MyAdapter(this);
        adapter.setData(mDataName, mDataImage);
        mListView.setAdapter(adapter);

        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Toast.makeText(getApplicationContext(), mDataName[i], Toast.LENGTH_LONG).show();
            }
        });
    }
}

运行效果和上一节一样:

25. 【Android教程】列表控件 ListView,Android 入门教程,android

4. 小结

本节主要介绍了 ListView 搭配 BaseAdapter 实现列表功能的方法,BaseAdapter 比 ArrayAdapter 和 SimpleAdapter 拥有更大的可控性,我们可以自己实现很多复杂的功能。目前更推荐使用的是 Google 近年推出的 RecyclerView,不过基本原理和 ListView 类似,本节主要介绍的是基础的用法,在掌握了基本用法及核心思想之后,可以继续学习一些优化手段及高级用法。文章来源地址https://www.toymoban.com/news/detail-853956.html

到了这里,关于25. 【Android教程】列表控件 ListView的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#,入门教程(20)——列表(List)的基础知识

    上一篇: C#,入门教程(19)——循环语句(for,while,foreach)的基础知识 https://blog.csdn.net/beijinghorn/article/details/124060844 List顾名思义就是数据列表,区别于数据数组(array)。 List比数组提供强大得多!多!多!多!的功能,能存储更多!多!多!类型的数据(泛型)! List是更

    2024年01月16日
    浏览(53)
  • 界面控件DevExpress WPF中文入门级教程 - 格式化值

    DevExpress WPF v21.2高速下载 格式化值概述 大多数DevExpress WPF控件都接受数据输入,并尽可能为您的最终用户提供键盘驱动的数据输入 - 以及灵活的数据表示格式。 轻松应用数字或日期时间格式来编辑值,以提高 WPF 应用程序的可用性。 您可以使用标准或自定义格式说明符、复合

    2024年02月04日
    浏览(55)
  • 条码控件Aspose.BarCode入门教程(8):C#从图像中读取条形码

    Aspose.BarCode for .NET 是一个功能强大的API,可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能,以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理,并允许将各类文档导出或

    2023年04月25日
    浏览(47)
  • Python入门教程+项目实战-11.4节: 元组与列表的区别

    目录 11.4.1 不可变数据类型 11.4.2 可变数据类型 11.4.3 元组与列表的区别 11.4.4 知识要点 11.4.5 系统学习python 不可变数据类型是指不可以对该数据类型进行修改,即只读的数据类型。迄今为止学过的不可变数据类型有字符串,元组。 在使用[]操作符对字符串,元组进行修改时

    2024年02月01日
    浏览(55)
  • Android最常用的控件ListView(详解)

           在Android开发中,ListView是一个比较常用的控件。它以列表的形式 展示具体数据内容,并且能够根据数据的长度自适应屏幕显示。     1.布局界面 activity_main.xml 代码:    2.类文件 MainActivity.java 代码:    1.ArrayAdapter适配器 1、ArrayAdapter适用亍数组或数据ArrayList(动态数

    2023年04月09日
    浏览(44)
  • Android开发入门教程

    当涉及到 Android 开发入门教程时,以下是一个详细的大纲,包含了一些常见的实践和指导: 1. Android 概述    - 介绍 Android 平台的基本概念和特点    - 解释 Android 应用的组成和架构    - 说明 Android 应用的开发环境和工具 2. 开发准备    - 安装和配置 Java 开发环境    - 下载

    2024年02月16日
    浏览(45)
  • Android Studio 中列表视图(ListView)的应用

    目录 引言 一、列表视图的作用 二、列表视图的工作原理和工作方式 三、准备数据源 四、适配器的使用 五、布局文件中的列表视图 六、自定义列表项布局 七、列表项点击事件处理 八、列表的优化 十、示例代码和演示 十一、总结和展望 参考资料:         欢迎来到本

    2024年02月08日
    浏览(40)
  • Android入门教程||Android 架构||Android 应用程序组件

    Android 操作系统是一个软件组件的栈,在架构图中它大致可以分为五个部分和四个主要层。 在所有层的最底下是 Linux - 包括大约115个补丁的 Linux 3.6。它提供了基本的系统功能,比如进程管理,内存管理,设备管理(如摄像头,键盘,显示器)。同时,内核处理所有 Linux 所擅

    2024年02月13日
    浏览(43)
  • Android 逆向入门保姆级教程

    作者:37手游移动客户端团队 前言 什么是 Android 逆向开发? Android 逆向开发是指对已发布的 Android 应用进行分析和破解,以了解应用程序的内部工作原理,获取应用程序的敏感信息,或者修改应用程序的行为。逆向开发可以帮助开发人员了解他人的代码实现,也可以帮助黑客

    2024年02月11日
    浏览(46)
  • Android入门教程 | ImageView 图片显示

    为了让App界面更美观生动,我们可以放上图片。 显示图片是“刚需”。不论是书籍,报纸,网站,都有显示图片的需求。毕竟“无图无真相”。 在 Android 应用开发中,我们通常使用 ImageView 来显示图片。 ImageView的主要属性 ImageView的使用 ImageView经常用来显示图片。例如直接显

    2024年02月03日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包