news 2026/7/4 6:22:34

Android 基础入门教程2.5.3 Spinner(列表选项框)的基本使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 基础入门教程2.5.3 Spinner(列表选项框)的基本使用

2.5.3 Spinner(列表选项框)的基本使用

分类Android 基础入门教程

本节引言:

本来本节是想给大家介绍一个Gallery(画廊)的一个控件的,后来想想还是算了,因为 在Android 4.1后就已经被弃用了,尽管我们可以通过兼容不来使用Gallery,不过想想 还是算了,因为Gallery在每次切换图片的时候,都需要重新创建视图,这样无疑会造成 很大资源浪费!我们可以通过其他方法来实现Gallery效果,比如通过HorizontalScrollView 来实现水平滚动效果,或者编写一个水平方向的ListView~有兴趣自己谷歌!

本节学习的是一个叫做Spinner的Adapter控件! 应用场景:当我们的app需要用户输入数据时,除了让用户自己打字以外,还有一种比较贴心的设计: 列出一组选项让用户从中挑选,从而方便了我们的用户! 话不多说,开始学习Spinner的基本用法~


1.相关属性

  • android:dropDownHorizontalOffset:设置列表框的水平偏移距离
  • android:dropDownVerticalOffset:设置列表框的水平竖直距离
  • android:dropDownSelector:列表框被选中时的背景
  • android:dropDownWidth:设置下拉列表框的宽度
  • android:gravity:设置里面组件的对其方式
  • android:popupBackground:设置列表框的背景
  • android:prompt:设置对话框模式的列表框的提示信息(标题),只能够引用string.xml 中的资源id,而不能直接写字符串
  • android:spinnerMode:列表框的模式,有两个可选值:dialog:对话框风格的窗口dropdown:下拉菜单风格的窗口(默认)
  • 可选属性:android:entries:使用数组资源设置下拉列表框的列表项目

2.使用示例:

对了,Spinner会默认选中第一个值,就是默认调用spinner.setSection(0), 你可以通过这个设置默认的选中值,另外,会触发一次OnItemSelectedListener 事件,暂时没找到解决方法,下面折衷的处理是:添加一个boolean值,然后设置 为false,在onItemSelected时进行判断,false说明是默认触发的,不做任何操作 将boolean值设置为true;true的话则正常触发事件! 示例中写了两个不同的Spinner,从数据源,列表框风格等进行对比~ 接下来我们来看下

效果图

代码实现

这里依然使用的我们前面的可复用BaseAdapter:

第一个Spinner的数据源编写:

res/values下编写一个:myarrays.xml的文件,内容如下:

<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="data"> <item>英勇青铜</item> <item>不屈白银</item> <item>荣耀黄金</item> <item>华贵铂金</item> <item>璀璨钻石</item> <item>超凡大师</item> <item>最强王者</item> </string-array> </resources>

接着是第二个Spinner的布局:item_spin_hero.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" android:orientation="horizontal" android:padding="5dp"> <ImageView android:id="@+id/img_icon" android:layout_width="48dp" android:layout_height="48dp" android:src="@mipmap/iv_lol_icon1" /> <TextView android:id="@+id/txt_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="15dp" android:text="德玛西亚" android:textSize="16sp" /> </LinearLayout>

再接着编写一个Entitiy实体类:Hero.java

/** * Created by Jay on 2015/9/24 0024. */ public class Hero { private int hIcon; private String hName; public Hero() { } public Hero(int hIcon, String hName) { this.hIcon = hIcon; this.hName = hName; } public int gethIcon() { return hIcon; } public String gethName() { return hName; } public void sethIcon(int hIcon) { this.hIcon = hIcon; } public void sethName(String hName) { this.hName = hName; } }

最后是MainActivity的布局与Java代码部分:

布局文件:activity_main.xml

<LinearLayout 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" android:orientation="vertical" android:padding="5dp" tools:context=".MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="选择您的排位分段" android:textColor="#44BDED" android:textSize="18sp" /> <Spinner android:id="@+id/spin_one" android:layout_width="100dp" android:layout_height="64dp" android:entries="@array/data" android:prompt="@string/spin_title" android:spinnerMode="dialog" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="选择你的拿手英雄~" android:textColor="#F5684A" android:textSize="18sp" /> <Spinner android:id="@+id/spin_two" android:layout_width="wrap_content" android:layout_height="64dp" /> </LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener { private Spinner spin_one; private Spinner spin_two; private Context mContext; //判断是否为刚进去时触发onItemSelected的标志 private boolean one_selected = false; private boolean two_selected = false; private ArrayList<Hero> mData = null; private BaseAdapter myAdadpter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; mData = new ArrayList<Hero>(); bindViews(); } private void bindViews() { spin_one = (Spinner) findViewById(R.id.spin_one); spin_two = (Spinner) findViewById(R.id.spin_two); mData.add(new Hero(R.mipmap.iv_lol_icon1,"迅捷斥候:提莫(Teemo)")); mData.add(new Hero(R.mipmap.iv_lol_icon2,"诺克萨斯之手:德莱厄斯(Darius)")); mData.add(new Hero(R.mipmap.iv_lol_icon3,"无极剑圣:易(Yi)")); mData.add(new Hero(R.mipmap.iv_lol_icon4,"德莱厄斯:德莱文(Draven)")); mData.add(new Hero(R.mipmap.iv_lol_icon5,"德邦总管:赵信(XinZhao)")); mData.add(new Hero(R.mipmap.iv_lol_icon6,"狂战士:奥拉夫(Olaf)")); myAdadpter = new MyAdapter<Hero>(mData,R.layout.item_spin_hero) { @Override public void bindView(ViewHolder holder, Hero obj) { holder.setImageResource(R.id.img_icon,obj.gethIcon()); holder.setText(R.id.txt_name, obj.gethName()); } }; spin_two.setAdapter(myAdadpter); spin_one.setOnItemSelectedListener(this); spin_two.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { switch (parent.getId()){ case R.id.spin_one: if(one_selected){ Toast.makeText(mContext,"您的分段是~:" + parent.getItemAtPosition(position).toString(), Toast.LENGTH_SHORT).show(); }else one_selected = true; break; case R.id.spin_two: if(two_selected){ TextView txt_name = (TextView) view.findViewById(R.id.txt_name); Toast.makeText(mContext,"您选择的英雄是~:" + txt_name.getText().toString(), Toast.LENGTH_SHORT).show(); }else two_selected = true; break; } } @Override public void onNothingSelected(AdapterView<?> parent) { } }

另外关于Spinner的OnItemSelectedListener,以及如何获得选中项的值,就自己看上面的 代码啦~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 15:56:00

既然强转会报错,java为啥不封装处理好,避免强转报错?

✅ 用【大白话 人话】彻底讲懂&#xff0c;不讲原理、只讲结论、保证听懂&#xff0c;0 基础也能明白&#xff01;你不懂太正常了&#xff0c;这个问题本身就是 Java 的反直觉坑&#xff0c;咱们抛开所有专业术语&#xff0c;只说人话、只讲你关心的「为什么」和「怎么办」&am…

作者头像 李华
网站建设 2026/6/25 9:49:47

一文彻底搞懂算力计算:CPU与GPU的核心方法全解析

在AI大模型训练/推理、高性能计算&#xff08;HPC&#xff09;、数据中心运维等场景中&#xff0c;“算力”是衡量硬件性能的核心指标&#xff0c;也是方案选型、成本评估的关键依据。但很多开发者对算力的理解仅停留在“TOPS”“FLOPS”等名词层面&#xff0c;不清楚其具体计算…

作者头像 李华
网站建设 2026/7/1 9:44:47

搞定JAX高效并行训练

&#x1f493; 博客主页&#xff1a;借口的CSDN主页 ⏩ 文章专栏&#xff1a;《热点资讯》 搞定JAX高效并行训练&#xff1a;从理论到实战的深度探索目录搞定JAX高效并行训练&#xff1a;从理论到实战的深度探索 引言&#xff1a;为何JAX并行训练是AI工程的分水岭 一、JAX并行训…

作者头像 李华
网站建设 2026/7/1 9:44:49

如何在liunx环境安装PageAdmin Cms系统

web系统一般建议安装在srv/wwwoot目录下&#xff0c;下面步骤演示如何安装pageadmin版本。 1、进入srv目录&#xff0c;创建wwwroot/demo目录&#xff0c;生产环境demo替换为网站标识或域名标识&#xff0c;方便后期识别。2、上传web文件zip压缩包到 /srv/wwwroot/demo目录下解…

作者头像 李华
网站建设 2026/7/1 9:44:53

终于有人把数据血缘说明白了

在与众多同行和读者的交流中&#xff0c;笔者察觉到“数据血缘”这一概念被频繁提及&#xff0c;然而大多数人对其背后的深层价值、技术实现路径以及可能遇到的难题&#xff0c;还缺乏深刻的理解。简单来说&#xff0c;掌握数据血缘&#xff0c;可以在数据出现问题时迅速找到根…

作者头像 李华
网站建设 2026/7/3 20:49:12

彻底解析Java访问修饰符:public、private、protected及默认的区别

文章目录彻底解析 Java 访问修饰符&#xff1a;public、private、protected 及默认的区别&#xff1f;什么是访问修饰符&#xff1f;第一部分&#xff1a;public&#xff08;公共的&#xff09;public 的作用范围public 的应用场景示例代码第二部分&#xff1a;private&#xf…

作者头像 李华