商城首页欢迎来到中国正版软件门户

您的位置:首页 >2.5.3 Spinner(列表选项框)的基本使用

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

  发布于2026-08-12 阅读(0)

扫一扫,手机访问

本节引言:

原本这节是打算介绍一个Gallery(画廊)控件的,不过后来还是决定不展开讲了。原因很直接:从Android 4.1开始,它就已经被弃用了。虽然通过兼容方式依然可以继续使用Gallery,但意义其实不大,因为它在每次切换图片时都要重新创建视图,这种做法显然会带来不小的资源浪费。真想实现类似Gallery的效果,办法并不少,比如用HorizontalScrollView来做水平滚动,或者自己写一个水平方向的ListView。感兴趣的话,可以自己去Google了解一下。

本节学习的是一个叫做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的文件,内容如下:



    
        英勇青铜
        不屈白银
        荣耀黄金
        华贵铂金
        璀璨钻石
        超凡大师
        最强王者
    

接着是第二个Spinner的布局:item_spin_hero.xml





再接着编写一个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






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 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();
        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(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

本节小结

好的,本节给大家介绍了Spinner(下拉选项框)的使用,例子还是蛮有趣的,哈哈~! 别问我哪个区什么段位,我可是人机小王子,可惜一直在青铜分段苦苦挣扎~ 你知道为什么的,好吧,本节就到这里~

本文转载于:https://www.runoob.com/w3cnote/android-tutorial-spinner.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注