Android常见界面控件(三)

news2024/11/14 21:18:29

目录

前言

列表控件ListView

常用属性

常用适配器

1.BaseAdapter

2.SimpleAdapter

3.ArrayAdapter

购物商城

选择菜品照片

创建布局文件

实现购物商城列表界面的显示效果


前言

在前面,我们已经讲了六个常用的界面控件和五个界面布局,那么本篇我们就来讲解一下在android也比较常用的控件--ListView控件。

列表控件ListView

在android中,列表控件是一个比较常用的控件,以列表的形式来展示数据内容,能够根据列表的高度自适应屏幕展示。我们手机上的“联系人”就可以通过ListView来实现,通过ListView能让用户上下滑动查看列表信息。我们也可以在列表中放各种控件,比如Button、ImageView等.

ListView是用来显示大量的数据集的控件,我们不可能给每个item去设置相应的数,这时候就需要借助Adapter来帮助我们完成UI控件和数据的绑定工作。

常用属性

属性说明
android:listSelector当条目被点击后,改变条目的背景颜色
android:divider设置分割线的颜色
android:dividerHeight设置分割线的高度
android:scrollbars是否显示滚动条
android:fadingEdge去掉上边和下边的黑色阴影

在XML布局文件格式如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:listSelector="#fefefefe"
        android:scrollbars="none"/>
</RelativeLayout>

常用适配器

在为ListView控件添加数据时我们需要用到数据适配器。数据适配器(Adapter)是数据与视图之间的桥梁,类似于一个转换器,将复杂的数据转换成用户可以接受的方式展现。

1.BaseAdapter

BaseAdapter是最基本的数据适配器,是一个抽象类。在自定义数据适配器时,自定义的适配器会继承BaseAdapter,该抽象类具有4个抽象方法,根据这几个抽象方法对ListView控件进行数据适配。

方法功能
public int getCount() 获取item条目的总数
public Object getItem(int position)根据position(位置)获取某个item的对象
public long getItemId(int position)根据position(位置)获取某个item的id
public View getView(int position,View convertView,ViewGroup parent)获取相应position(位置)的item视图,position是当前item的位置,convertView用于复用旧视图,parent用于加载XML布局文件

BaseAapter的抽象方法

2.SimpleAdapter

SimpleAdapter是BaseAdapter的子类,实现了BaseAdapter中的四个抽象方法并将方法进行封装。所以我们在使用SimpleAdapter进行数据适配时,只需要在构造方法中传入相应的参数即可。

SimpleAdapter的构造方法:

SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

我们可以看到SimpleAdapter的构造方法有5个参数:

  • context:上下文对象。
  • data:数据集合。data中的每一项对应ListView控件中条目的数据。
  • resource:Item布局的资源id。
  • from:Map集合中的key值。
  • to:Item布局中对应的控件。

3.ArrayAdapter

 ArrayAdapter继承于BaseAdapter,用法与SimpleAdapter类似。在使用的时候,我们只需要在构造方法中传入相应的参数即可。.ArrayAdapter同样用于适配ListView控件,例如Android中废Setting(设置菜单)。

构造方法说明
public ArrayAdapter(Context context, int resource , T[] objects)基本构造方法,适用于有一个数组时,想要将其内容展示在列表视图中时使用
public ArrayAdapter(Context context, int resource , List<T> objects)List构造方法,允许使用一个List集合来初始化适配器,这在数据发生变化时非常有用,可以直接修改List集合来更新视图
public ArrayAdapter(Context context, int resource , int textViewResourceId ,T[] objects)带有布局和TextView ID的List构造方法,具有更好的灵活性,允许使用List集合初始化适配器后指定数据应该被填充到布局中的那个具体的TextView控件中
public ArrayAdapter(Context context, int resource , int textViewResourceId ,List<T> objects)带有布局和TextView ID的基本构造方法,具有更好的灵活性,允许使用数组初始化适配器后指定数据应该被填充到布局中的那个具体的TextView控件中
public ArrayAdapter(Context context, int resource ,int textViewResourceId)

用于创建一个 ArrayAdapter 实例,它通常用于将数据绑定到 ListView 或其他视图组件上

构造方法中参数的含义:

  • context:Context上下文对象。
  • resource:Item布局的资源id。
  • textViewResourceId:Item布局中相应的TextView控件的Id。
  • T[] objext:需要适配数组类型的数据。
  • List<T> objects: 需要适配List类型的数据。

我们如果创建在创建完数据适配器之后,可以通过ListView控件中的setAdapter()方法来添加数据适配器,如继承BaseAdapter的MyBaseAdapter示例添加到ListView控件中,示例代码如下:

 ListView mlistView = (ListView)finViewId(R.id.lv);   // 初始化ListView控件
 MyBaseAdapter mAdapter=new MyBaseAdapter();          //创建MyBaseAdapter实例
 mlistView.setAdapter(mAdapter);                      //设置数据类型到ListView控件中

购物商城

既然我们已经学习了前面这些LIstView的相关属性以及其适配器,那么接下来我们来实现一个购物商城。

此处我们选择的是实现一个选菜的商城。

选择菜品照片

我们可以从网上先选择一些菜品照片保存到drewable目录下。以下是我实现这个点菜商城所用的菜品照片。

创建布局文件

创建一个main_activity.xml,和一个list.xml。

在main_activity布局文件中放置一个TextView控件用来显示商城标题。并放置一个ListView列表控件来显示商城列表。

<?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="vertical">

    <TextView
        android:text="购物商城"
        android:textSize="30dp"
        android:gravity="center"
        android:background="@android:color/holo_blue_light"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <ListView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"/>

</LinearLayout>

list.xml布局文件用来存储菜品的图片、名称和价格。

我们放置一个ImageView控件用来显示图片信息,放置两个TextView控件用来显示商品的名称和价格。 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   android:padding="16dp">
    <ImageView
        android:id="@+id/cuisine"
        android:layout_width="120dp"
        android:layout_height="90dp"
        android:src="@drawable/beaf"
        android:layout_centerVertical="true"/>
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@id/cuisine"
        android:layout_centerVertical="true">
        <TextView
            android:id="@+id/title"
            android:text="红烧肉"
            android:textSize="20sp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#000000"/>
    <TextView
        android:id="@+id/tv_price"
        android:text="价格:"
        android:textSize="20sp"
        android:layout_below="@+id/title"
        android:layout_marginTop="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#FF8F03"/>
        <TextView
            android:id="@+id/price"
            android:textSize="20sp"
            android:textColor="#FF8F03"
            android:layout_toRightOf="@id/tv_price"
            android:layout_below="@id/title"
            android:layout_marginTop="12dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
    </RelativeLayout>
</RelativeLayout>

实现购物商城列表界面的显示效果


import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class shop extends AppCompatActivity {
    //放置菜品的名称和价格
    private String[] titles={"红烧肉","辣椒炒肉","土豆炒肉","扬州炒饭","冬瓜汤"};
    private String[] prices={"¥30","¥35","¥40","¥25","¥20"};
    //放置菜品图片
    private int[] icons={R.drawable.bouilli,R.drawable.jollof,R.drawable.tomato,R.drawable.yangzhou,R.drawable.gourd};
    private ListView listView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);
        listView = findViewById(R.id.tv);
        MyBaseAdater mAdapter = new MyBaseAdater();
        listView.setAdapter(mAdapter);
    }
    //自定义一个数据适配器, 继承自BaseAdapter, 重写getCount(), getItem(), getItemId(), getView()方法
   class MyBaseAdater extends BaseAdapter {
        @Override
        public int getCount() {
            return titles.length;//获取菜品数量
        }

        @Override
        public Object getItem(int i) {
            return titles[i];//获取菜品名称
        }

        @Override
        public long getItemId(int i) {
            return  i;//获取菜品id
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            // 加载list布局文件
            View v = View.inflate(shop.this, R.layout.list, null);
            // 获取商品标题文本框
            TextView title = v.findViewById(R.id.title);
            // 获取商品价格文本框
            TextView price = v.findViewById(R.id.price);
            // 获取商品图标图像视图
            ImageView icon = v.findViewById(R.id.cuisine);
            // 设置商品标题
            title.setText(titles[i]);
            // 设置商品价格
            price.setText(prices[i]);
            // 设置商品图标
            icon.setImageResource(icons[i]);
            // 返回加载的布局文件
            return v;
        }
    }
}

 运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HarmonyOS NEXT星河版开发实战】灯泡定时开关

个人主页→VON 收录专栏→鸿蒙综合案例开发​​​​​ 代码及其图片资源会发布于gitee上面&#xff08;已发布&#xff09; 所有与鸿蒙开发有关的知识点都会在gitee上面进行发布 gitee地址https://gitee.com/wang-xin-jie234 目录 前言 界面功能介绍 界面构建思路 头部 中间…

数据结构——二叉树经典OJ题

1.单值二叉树 单值二叉树&#xff1a;就是判断二叉树里的所有值是否都一样 bool isUnivalTree(struct TreeNode* root) {if(rootNULL)return true;//查找有没有左子树并且看左子树当前指向的值是否和根当前指向的值相等if(root -> left && root -> left -> v…

【三维室内数据集】ScanNet v2使用说明

【版权声明】本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 参考书籍&#xff1a;《人工智能点云处理及深度学习算法》 本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python…

Python自动化:图片批量添加水印

前言 本文将讲述怎样通过Python自动化的方法&#xff0c;来对照片进行批量的加水印&#xff0c;从而能够有效地阻止他人的非法占有&#xff0c;提高工作的效率。 Python自动化&#xff1a;办公效率的革命 自动化解决方案 实现步骤 读取指定文件夹中的图片&#xff1a;打开…

YOLOv9改进策略【卷积层】| 利用MobileNetv4中的UIB、ExtraDW优化RepNCSPELAN4

一、本文介绍 本文记录的是利用ExtraDW优化YOLOv9中的RepNCSPELAN4&#xff0c;详细说明了优化原因&#xff0c;注意事项等。ExtraDW是MobileNetv4模型中提出的新模块&#xff0c;允许以低成本增加网络深度和感受野&#xff0c;具有ConvNext和IB的组合优势。可以在提高模型精度…

redis | 认识非关系型数据库Redis的哈希数据类型

Redis 非关 kv型 哈希通用命令python 操作hash应用场景 数据类型 数据类型丰富&#xff0c;字符串strings,散列hashes,列表lists&#xff0c;集合sets,有序集合sorted sets等等 哈希 定义 1、由field和关联的value组成的键值对 类似于python的键值对 2、field和value.是字符…

『功能项目』新输入系统【07】

我们打开上一篇06新输入系统项目&#xff0c; 本章要做的事情是摄像机跟随主角移动&#xff0c; 给主角增加一个Player标签方便主摄像机查找主角对象 在编辑场景调好角度&#xff0c;选择Main Camera对象按键盘Ctrl Shift F使运行场景与编辑场景相同 新建CameraCtrl脚本代码 …

秋招突击——8/16——字节广告业务——面经整理——二面挂

文章目录 引言一面面试内容基础知识一、Redis为什么进行AOF重写&#xff1f;二、AQS和Conditon的使用三、乐观锁和分布式锁有什么差异&#xff1f;频繁使用乐观锁行不行&#xff1f;四、Java的即时编译技术五、Java中的JVM调优是如何做的&#xff1f;六、Java中创建对象的流程&…

STM32——BKP备份寄存器RTC实时时钟

首先是理论知识Unix时间戳&#xff1a; 时间戳只显示秒&#xff0c;没有进位&#xff0c;永不进位的秒计数器&#xff0c;60秒就是60秒&#xff0c;100秒就是100秒&#xff0c;它可以和年月日/时分秒进行转换 优点&#xff1a;1、简化硬件电路&#xff08;只需要考虑秒的容量…

C语言 猜数字游戏

目录 1. 随机数⽣成 1.1 rand 1.2 srand 1.3 time 1.4 设置随机数的范围 2. 猜数字游戏实现 游戏要求&#xff1a; 1. 电脑⾃动⽣成1~100的随机数 2. 玩家猜数字&#xff0c;猜数字的过程中&#xff0c;根据猜测数据的⼤⼩给出⼤了或⼩了的反馈&#xff0c;直到猜对&a…

运行微信小程序报错:Bad attr data-event-opts with message

问题 使用uniapp 编译&#xff0c;运行微信小程序环境时&#xff0c;报错 Bad attr data-event-opts with message。&#xff08;这个错误报错原因很多&#xff0c;这里只解决一个&#xff09; 原因 原因是&#xff1a;代码中有&#xff1a; :key"swiperList i"…

猫头虎分享:Python库 Pip 的简介、安装、用法详解入门教程

猫头虎分享&#xff1a;Python库 Pip 的简介、安装、用法详解入门教程 &#x1f3af; 大家好&#xff01;今天猫头虎带您一起探索Python世界中的一个基础工具——Pip。作为一名Python开发者&#xff0c;掌握Pip的使用不仅能帮助你更有效地管理项目中的依赖&#xff0c;还能让你…

【Java】Spring Boot使用 Email 传邮件 (上手图解)

Java系列文章目录 补充内容 Windows通过SSH连接Linux 第一章 Linux基本命令的学习与Linux历史 文章目录 Java系列文章目录一、前言二、学习内容&#xff1a;三、问题描述四、解决方案&#xff1a;4.1 认识依赖4.2 发送邮件步骤4.2.1 先获取授权码4.2.1 邮件配置4.2.2 主体内容…

使用 jar-analyzer 和dbeaver 分析java

https://github.com/jar-analyzer/jar-analyzer 可以进行jar分析&#xff0c;包括method调用 分析完可以通过界面进行一些分析&#xff0c;如果复杂还可以用DbWeaver 打开数据库进行分析

Java SpringBoot+Vue实战教程:如何搭建高中素质评价档案系统?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【通俗易懂】限流、降级、熔断有什么区别?

目录 一、限流 1.1 简介 1.2 限流算法 二、降级 2.1 简介 2.2 降级的方式 延迟服务 在粒度范围内关闭服务&#xff08;片段降级或服务功能降级&#xff09; 页面异步请求降级 写降级 读降级 2.3 降级的介入方式 自动开关降级 服务超时 失败次数 发生故障 限流…

Markdown 美化 Github 个人主页

注&#xff1a;本文参考这篇博客 http://t.csdnimg.cn/KXhSw 目录 1 效果展示2 创建仓库3 编写 Markdown3.1 动态波浪图3.2 打字机动图3.3 技术栈图标3.4 项目贡献统计3.5 连续贡献统计3.6 贡献统计图3.7 代码时长统计3.8 仓库代码占比 1 效果展示 先来看看效果&#xff1a; 动…

java整合DL645-2007与Dl645-1997

注意事项: 前导字节-一般在传输帧信息前,都要有0~4个FE不等,所以这里要注意,对于主站来说,直接发送4个FE作为前导字节即可。而从站回复,就不一定了,根据厂家不同而不同,有些没有FE的,也有4个FE的,所以对于接受程序,一定要慎重传输次序-所有的数据项都是先传低字节,…

【生日视频制作】云层直升机飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

云层直升飞机生日视频制作教程AE模板修改文字特效软件生成器玩法素 怎么如何做的【生日视频制作】云层直升机飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

web后端(javaEE)开发——servlet

目录 一、web后端开发概述 二、web后端开发环境搭建 1.安装服务器软件 2.安装JDK 三、创建web后端项目 1.创建项目 2.修改设置 3.*在IDEA中集成Tomcat* 四、Servlet创建和应用 1.概述 2.Servlet程序创建与配置 3.分析Servlet程序结构 一、web后端开发概述 web开发&a…