Android之创建ListView自定义控件

【Android】ListView 控件的简单使用 ListView 控件的简单使用 阅读详情

最常用和最难用的控件----ListView

ListView绝对是称得上Android中最常用的控件之一。几乎所有应用程序都会用到它。
ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。
不过比起先前学的几种控件,ListView的用法也相对复杂了很多。

新建项目ListViewTest

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
</LinearLayout>

一个ListView通常有两个职责。
(1)将数据填充到布局。
(2)处理用户的选择点击等操作。
一个ListView的创建需要三个元素
(1)ListView中的每一列的View
(2)填入View的数据或图片等。
(3)连接数据与ListView的适配器。
也就是说,要使用ListView,首先要了解什么是适配器。
适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView)
的桥梁,通过它能有效地实现数据与AdaterView的分离设置,使AndroidView与数据的绑定更加简便,修改更加方便。
Android中提供了很多的Adapter

Adapter 含义

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

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

SimpleCursorAdapter 用来绑定游标得到的数据

BaseAdapter 通用的基础适配器

其实适配器还有很多,要注意的是,各种Adapter只不过是转换的方式和能力不一样而已。

package net.nyist.lenovo.listviewtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

private String[] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango",
        "Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
            MainActivity.this,android.R.layout.simple_list_item_1,data);
    ListView listView= (ListView)findViewById(R.id.list_view);
    listView.setAdapter(adapter);
}
}

既然ListView是用于展示大量数据的,那我们就应该先将数据提供好。这些数据可以是从网上下载的,也可以是从数据库中读取的,应该视具体的应用程序场景而定。这里我就使用了一个简单的data数组来测试,里面包含了许多水果的名称。
不过,数组中的数据时无法直接传递给ListView的,我们还需要借助适配器来完成。
ArrayAdpter有多个构造函数的重载,应该根据实际情况选择合适的一种。
由于我们提供的数据都是字符串,因此将ArrayAdapter的泛型指定为String,然后在ArrayAdapter的构造函数中一次传入当前上下文、LitView子项布局的id,以及要适配的数据。注意,我们使用了android.R.layout.simple_list_item_1作为ListView子项布局的id,这是一个Android内置的布局文件,里面只有一个TextView,可用于简单地显示一段文本。这样适配器对象就构建好了。
最后,还需要调用ListView的setAdapter()方法,将构建好的适配器对象传递进去,这样ListView和数据之间的关联就建立完成了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0I9U22qy-1587024879884)(http://i.imgur.com/xBKRLfV.png)]
#定制ListView的界面
只能显示一段文本的ListView实在是太单调了,我们现在就来对ListView的界面进行定制,让它可以显示更加丰富的内容。
首先需要准备好一组图片。
接着定义一个实体类,作为ListView适配器的适配类型。新建Fruit,代码如下:

package net.nyist.lenovo.listviewtest;
public class Fruit {
private String name;

private int imageId;

public Fruit(String name ,int imageId){
    this.name = name;
    this.imageId = imageId;
}

public int getImageId() {
    return imageId;
}

public String getName() {
    return name;
}
}

Fruit类中只有两个字段,name表示水果的名字,imageId表示水果对应图片的资源id。
然后需要为ListView的子项指定一个我们自定义的布局,在layout目录下新建fruit_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">

<ImageView
    android:id="@+id/fruit_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/fruit_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_marginLeft="10dp"
    />
</LinearLayout>

在这个布局中,我们定义了一个ImageView用于显示水果的图片,有定义了一个TextView用于显示水果的名称,并让TextView在垂直方向上居中显示。

接下来需要创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型指定为Fruit类。新建类FruitAdapter,代码如下所示:

package net.nyist.lenovo.listviewtest;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class FruitAdapter extends ArrayAdapter<Fruit>{

private int resourceId;

public FruitAdapter(Context context, int textViewResourceId, List<Fruit>objects){
    super(context,textViewResourceId,objects);
    resourceId = textViewResourceId;
}


@Override
public View getView(int position,  View convertView,  ViewGroup parent) {
    Fruit fruit = getItem(position);//获取当前项的Fruit实例
    View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
    ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
    TextView fruitName = (TextView)view.findViewById(R.id.fruit_name);
    fruitImage.setImageResource(fruit.getImageId());
    fruitName.setText(fruit.getName());
    return view;
}
}

// 加载布局管理器,将xml布局转换为view对象
View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
//利用view对象,找到布局中的组件
ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView)view.findViewById(R.id.fruit_name);
FruitAdapter
重写了父类的一组构造函数,用于将上下文,ListView子项布局的id和数据都传递进来。
另外又重写了getView()方法这个方法,这个方法在每个子项被滚动到屏幕内的时候会被调用。在getView()方法中,首先通过getItem()方法得到当前项的Fruit实例,然后使用LayoutInflater来为这个子项加载我们传入的布局。
这里LayoutInflater的inflate()方法接收三个参数,前两个参数我们已经知道是什么意思了,第三个参数指定成false,表示只让我们在父布局中声明的layout属性生效,但不为这个View添加父布局,因为一旦View有了父布局之后,他就不能再添加到ListView中了。
接下来调用View的findViewById()方法分别获取到ImageView和TextView的实例。
并分别调用它们的setImageResource()和setText()方法来设置显示的图片和文字,,最后将布局返回,这样定义的适配器就完成了。
下面修改MainActivity中的代码,如下所示:

package net.nyist.lenovo.listviewtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

private List<Fruit>fruitList = new ArrayList<>();



private String[] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango",
        "Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initFruits();//初始化水果数据
    FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
    ListView listView= (ListView)findViewById(R.id.list_view);
    listView.setAdapter(adapter);
}
private void initFruits(){
    for (int i  = 0;i < 2;i++){
        Fruit apple = new Fruit("Apple",R.drawable.apple_pic);
        fruitList.add(apple);
        Fruit banana = new Fruit("Banana",R.drawable.banana_pic);
        fruitList.add(banana);
        Fruit orange = new Fruit("Orange",R.drawable.orange_pic);
        fruitList.add(orange);
        Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon_pic);
        fruitList.add(watermelon);
        Fruit pear = new Fruit("Pear",R.drawable.pear_pic);
        fruitList.add(pear);
        Fruit grape = new Fruit("Grape",R.drawable.grape_pic);
        fruitList.add(grape);
        Fruit pineapple = new Fruit("Pineapple",R.drawable.pineapple_pic);
        fruitList.add(pineapple);
        Fruit strawberry = new Fruit("Strawberry",R.drawable.strawberry_pic);
        fruitList.add(strawberry);
        Fruit cherry = new Fruit("Cherry",R.drawable.cherry_pic);
        fruitList.add(cherry);
        Fruit mango = new Fruit("Mango",R.drawable.mango_pic);
        fruitList.add(mango);

    }
}
}

这里添加一个initFruits()方法,用于初始化所有的水果数据。在Fruit类的构造函数中将水果的名字和对应的图片id传入,然后把创建好的对象添加到水果列表中,另外我们使用了一个for循环将所有的水果数据添加了两遍,这是因为如果只添加一遍的话,数据量还不足以充满整个屏幕,接着在onCreate()方法中创建了FruitAdpter对象,并将FruitAdapter作为适配器传递给ListView,这样定制ListView界面的任务就做好了。

这里写图片描述

#ListView的点击事件
话说回来,ListView的滚动毕竟只是满足了我们视觉上的效果,可是如果ListView中的子项不能点击的话,这个控件就没有什么实际的用途了。因此,本小节我们就来学习一下ListView如何才能响应用户的点击事件。
修改MainActivity中的代码,如下所示:

public class MainActivity extends AppCompatActivity {

private List<Fruit>fruitList = new ArrayList<>();
private String[] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango",
        "Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initFruits();//初始化水果数据
    FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);
    ListView listView= (ListView)findViewById(R.id.list_view);
    listView.setAdapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Fruit fruit = fruitList.get(position);
            Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();
        }
    });
}

可以看到,我们使用setOnItemClickListener()方法为ListView注册了一个监听器,当用户点击了ListView中的任何一个子项时,就会回调onItemClick()方法。在这个方法中可以通过position参数判断出用户点击的是哪一个子项,然后获取到响应的水果,并通过Toast将水果的名字显示出来。

Android ListView添加Button及其事件 为ListView的每个列表添加Button 并且实现他的单击事件 立即下载

相关推荐

Android ListView控件显示数据库中图片

Android ListView控件显示数据库中图片

Android ListView中的item添加按钮点击事件

ListView中的行和行中item的点击监听事件

holiey的博客 2645

android listview自定义控件例子

android中Listview的创建和几个视觉效果的设置

Android为ListView的item添加按钮控件

1.先看下效果图:        在这里仅供测试,我把数据都写死了,根据需要可以自己进行修改,此外实现ListView上面每个Item上的Button的事件有两种方法: 1.使用final变量扩展局部变量的生命周期范围主要代码(本文最后附全部代码): [java] view plaincopy //注意原本getView方法中的

似水流年 1万+

C# ListView中添加多种自定义控件源码

C#的ListView添加各种自定义控件,CheckBox,ComboBox等

自定义控件ListView上下滑动效果(开源)

自定义控件ListView上下滑动效果(开源)

android 自定义listview控件,一个简单又完整的自定义ListView

ListView一、简单列表1.在activity_main中添加控件ListViewxmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:o...

weixin_35916466的博客 2071

txt经纬度批量转面要素(附自定义ArcGIS工具箱方法)

当涉及大量txt坐标文件需要转换成面要素的时候,逐步操作工作量较大。本文由需求出发,以ArcGIS10.2为例,采用python脚本自定义ArcGIS工具,实现批量操作的目的。

m0_59216200的博客 1818

Android ListView的应用(如何去实现ListView控件(自定义适配器))

稀稀拉拉学了有快1年的Android了,但是依然跟刚入门的小白一样,用到啥学啥,上网查别人的代码,然后复制粘贴过去,最后什么都没学到,现在是深有体会,我希望记录一些知识点,踏踏实实的走好每一步,希望刚入门的小白能用到。首先Android Studio中有许多系统自带的空间,比较常见是TextView,EditView,ImageView,Button,ImageButton,等等许多的空间,现在我...

清风半夜鸣蛙 1371

使用FileZilla在武汉大学IGS数据分析中心下载GNSS数据

2.依次点击如下图标下载到本地并解压安装(按系统选择要下载的版本)

qq_43381998的博客 6042

疾病负担研究(GBD)介绍

今天我们来聊一聊第一个公共数据库——GBD数据库,全称叫做global burden of disease(全球疾病负担),该数据库每年都会更新,目前已经更新到GBD2019。 这里直接给大家贴出网址:Global Burden of Disease Study 2019 (GBD 2019) Data Resources | GHDx 上图中红色圈圈标识的就是数据库的数据获取界面的链接,大家直接点击即可. 数据的检索十分方便: Context下拉菜单中可以选择不同的选项,默认是caus

weixin_44240228的博客 1万+

android listview动态添加控件,Android ListView自定义适配器动态添加按钮?

我正在使用自定义适配器为活动(从主活动到达)设置我的ListView。我试图添加一个按钮(和一个EditText后来)动态考虑我没有使用定义的布局文件(只是布局的每一行ListView)。似乎无法得到它的工作(最后5行)。这里是我的活动代码:Android ListView自定义适配器动态添加按钮?public class SubSelectActivity extends ListActivit...

weixin_36091052的博客 783

Revit二次开发之双事件:空闲事件与DocumentChanged事件

对以下文章所展示的代码进行了修改,当前展示的代码可直接复制使用。 由于本人初学,下列语言为个人理解,如有错误请指正。   《引用1》中: 使用模态对话框,或者尽量保证事件在ExternalCommand的Execute函数或者ExternalApplication的OnStartup函数里面注册。 如果一定要使用非模态对话框,那么请使用ExternalEvent事件的Raise函数,强迫...

一个Revit二次开发的实习生 6147

Android安卓开发基础-ListView

介绍安卓控件ListView在java文件及xml文件中的使用

weixin_53743049的博客 730

保姆级教程:手把手教你从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件(附网址规律总结)

本文提供从ENSEMBL官网下载GRCh38/GRCh37的GTF注释文件的详细教程,包括路径解析、版本号确定和下载命令示例。特别解析了GRCh37的特殊存储结构,并分享批量下载、文件校验等高级技巧,帮助生物信息学研究者高效获取基因组注释文件。

weixin_29289821的博客 204

【OpenClaw企业级智能体实战】第27篇:Skill生态运营——企业私有Skill商店的搭建与审核机制

2026年ClawHavoc供应链攻击事件曝光超1200个恶意Skill渗透公共技能市场,工信部明确要求企业审慎使用第三方技能包并严格审查代码。本文基于真实安全事件与行业实践,完整讲解企业私有Skill商店从0到1搭建方案,覆盖小团队极简GitLab私有仓库、中大型企业Nacos 3.2私有Registry两种主流架构,配套企业级安全审核四步法、静态代码扫描规则、CI/CD自动化审计、数字签名校验与版本生命周期管理。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 501

用安卓控件ListView写一个简单的学生列表

一.思路与效果图 思路: ListView的应用 使用SimpAdapter创建ListVieiew 步骤: 1.使用ListView控件 2.创建条目(item)布局文件 3.数据(LIst<Map<String,Object>>类型)准备 4.创建SimpAdapter对象 5.ListView类型变量关联控件ListView控件 6.为ListView设置SimpAdapter 效果图: 二.右键新建ListView控件 *新建完成后的item_layout.xml代码块

weixin_45090657的博客 1684

华为OD新系统机试真题-文章特征提取

华为OD机试新系统真题 【文章特征提取】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【文章特征提取】

qq_45776114的博客 732

新手自定义控件,创建属于自己的下拉刷新(一)---Android,ListView实现IOS的弹性效果

前言相信很多童鞋对于控件的下拉刷新都比较熟悉吧,常用的PullToRefresh开源库和Google自带的SwipeRefreshLayout大家肯定也很熟悉吧,但作为一个Android开发新手,对于自定义控件和自定义View来实现一些效果肯定还是比较恐惧,无从下手,笔者也是如此.但万事开头难,只要理清楚想要实现的效果,按照步骤来分布来具体代码实施就OK了. 其实下拉刷新,感觉万变不离其宗,对普通

qq_28690547的博客 1313

【Proteus仿真】点亮小灯系列仿真——小灯闪烁/流水灯/交通灯

本文介绍了基于AT89C51单片机的LED控制案例,共包含5个实例:1)单个LED闪烁;2)共阳极流水灯;3)共阴极流水灯;4)花样流水灯;5)交通灯模拟。每个案例详细说明了电路原理图、接线方式和控制程序实现,其中重点讲解了PWM调光原理及其在LED控制中的应用。案例由简至繁,从基础I/O控制到复杂花样显示,最后实现交通灯逻辑控制,展示了单片机在LED控制中的典型应用方法。文中提供了完整的源代码,便于读者理解和实践。

XU157303764的博客 1883

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android 自定义控件

就是继承已有的控件,创建新控件,保留继承的父控件的特性,并且还可以引入新特性。63 // 如果当前删除按钮没有显示出来,并且x方向滑动的速度大于y方向的滑动速度。7 // 计数值,每点击一次本控件,其值增加1。25 // 绘制一个填充色为蓝色的矩形。23 // 当前删除按钮是否显示出来了。16 // 本控件的点击事件。31 // 获取文字的宽和高。5 // 用于获取文字的宽和高。

2401_86637504的博客 1224

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

安卓Android Studio 控件之 卡片式ListView效果

在安卓APP开发过程中,ListView是常用的数据展示控件,不过系统自带的样式过于单调,而且显示数据单一。下面介绍一个卡片式的ListView控件。同样是经过测试,拿来主义,根据步骤一步步就能实现。 首先总体介绍一下思路:还是使用ListView控件,但是样式需要自己定义一个xml文件,在ListView控件引用样式时调用自己定义的xml文件即可。 主要功能:以卡片样式显示数据,卡片内数据可以实现点击事件的操作。以便于下一步操作选中的数据。 先上效果图: 下面介绍实现过程: 1、在a...

jackiesky1206的博客 6404

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android ListView 基础入门 简介以及深入优化

ListView 简介 ListView 是安卓里常用的控件, 本文介绍一下常用用法,以及优化等方法 本文地址 http://blog.youkuaiyun.com/never_cxb/article/details/48159717。转载请注明出处改写 activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/

手把手教你学安卓 2358

Android学习笔记——ListView

android listview控件的简单用法

DragonQiuNiu的博客 1601

Android学习之ListView的使用

ListView是Android中最常用的控件之一,虽然现在推荐使用RecycleView,但是作为初学者还是有必要了解ListView的基本用法的。 ListView的简单用法 简单地在ListView中单一显示文本还是比较简单的,首先在activity_main.xml中添加 <ListView android:id="@+id/list_view" ...

星河Dac 2484

Android常用控件--ListView的简单使用

ListView简单编写.如有错误,请指正,定虚心听取

段炼 9804
上一篇: Android之提升ListView的运行效率
下一篇: Android之布局详解
菜鸟码农阿庆
博客等级 码龄10年 61粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值