写点什么

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

作者:向阳逐梦
  • 2023-03-11
    四川
  • 本文字数:3656 字

    阅读完需:约 12 分钟

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

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

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

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,以及如何获得选中项的值,就自己看上面的 代码啦~

3.代码示例下载:

SpinnerDemo.zip


发布于: 刚刚阅读数: 7
用户头像

向阳逐梦

关注

人生享受编程,编程造就人生! 2022-06-01 加入

某公司芯片测试工程师,嵌入式开发工程师,InfoQ签约作者,阿里云星级博主,华为云·云享专家。座右铭:向着太阳,追逐梦想!

评论

发布
暂无评论
Spinner(列表选项框)的基本使用_android_向阳逐梦_InfoQ写作社区