[关闭]
@coder-pig 2015-09-24T07:24:42.000000Z 字数 5396 阅读 1400

Android基础入门教程——2.4.10 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的文件,内容如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <string-array name="data">
  4. <item>英勇青铜</item>
  5. <item>不屈白银</item>
  6. <item>荣耀黄金</item>
  7. <item>华贵铂金</item>
  8. <item>璀璨钻石</item>
  9. <item>超凡大师</item>
  10. <item>最强王者</item>
  11. </string-array>
  12. </resources>

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal"
  6. android:padding="5dp">
  7. <ImageView
  8. android:id="@+id/img_icon"
  9. android:layout_width="48dp"
  10. android:layout_height="48dp"
  11. android:src="@mipmap/iv_lol_icon1" />
  12. <TextView
  13. android:id="@+id/txt_name"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_marginLeft="10dp"
  17. android:layout_marginTop="15dp"
  18. android:text="德玛西亚"
  19. android:textSize="16sp" />
  20. </LinearLayout>

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

  1. /**
  2. * Created by Jay on 2015/9/24 0024.
  3. */
  4. public class Hero {
  5. private int hIcon;
  6. private String hName;
  7. public Hero() {
  8. }
  9. public Hero(int hIcon, String hName) {
  10. this.hIcon = hIcon;
  11. this.hName = hName;
  12. }
  13. public int gethIcon() {
  14. return hIcon;
  15. }
  16. public String gethName() {
  17. return hName;
  18. }
  19. public void sethIcon(int hIcon) {
  20. this.hIcon = hIcon;
  21. }
  22. public void sethName(String hName) {
  23. this.hName = hName;
  24. }
  25. }

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

布局文件:activity_main.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. android:padding="5dp"
  7. tools:context=".MainActivity">
  8. <TextView
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:text="选择您的排位分段"
  12. android:textColor="#44BDED"
  13. android:textSize="18sp" />
  14. <Spinner
  15. android:id="@+id/spin_one"
  16. android:layout_width="100dp"
  17. android:layout_height="64dp"
  18. android:entries="@array/data"
  19. android:prompt="@string/spin_title"
  20. android:spinnerMode="dialog" />
  21. <TextView
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:layout_marginTop="10dp"
  25. android:text="选择你的拿手英雄~"
  26. android:textColor="#F5684A"
  27. android:textSize="18sp" />
  28. <Spinner
  29. android:id="@+id/spin_two"
  30. android:layout_width="wrap_content"
  31. android:layout_height="64dp" />
  32. </LinearLayout>

MainActivity.java

  1. public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  2. private Spinner spin_one;
  3. private Spinner spin_two;
  4. private Context mContext;
  5. //判断是否为刚进去时触发onItemSelected的标志
  6. private boolean one_selected = false;
  7. private boolean two_selected = false;
  8. private ArrayList<Hero> mData = null;
  9. private BaseAdapter myAdadpter = null;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. mContext = MainActivity.this;
  15. mData = new ArrayList<Hero>();
  16. bindViews();
  17. }
  18. private void bindViews() {
  19. spin_one = (Spinner) findViewById(R.id.spin_one);
  20. spin_two = (Spinner) findViewById(R.id.spin_two);
  21. mData.add(new Hero(R.mipmap.iv_lol_icon1,"迅捷斥候:提莫(Teemo)"));
  22. mData.add(new Hero(R.mipmap.iv_lol_icon2,"诺克萨斯之手:德莱厄斯(Darius)"));
  23. mData.add(new Hero(R.mipmap.iv_lol_icon3,"无极剑圣:易(Yi)"));
  24. mData.add(new Hero(R.mipmap.iv_lol_icon4,"德莱厄斯:德莱文(Draven)"));
  25. mData.add(new Hero(R.mipmap.iv_lol_icon5,"德邦总管:赵信(XinZhao)"));
  26. mData.add(new Hero(R.mipmap.iv_lol_icon6,"狂战士:奥拉夫(Olaf)"));
  27. myAdadpter = new MyAdapter<Hero>(mData,R.layout.item_spin_hero) {
  28. @Override
  29. public void bindView(ViewHolder holder, Hero obj) {
  30. holder.setImageResource(R.id.img_icon,obj.gethIcon());
  31. holder.setText(R.id.txt_name, obj.gethName());
  32. }
  33. };
  34. spin_two.setAdapter(myAdadpter);
  35. spin_one.setOnItemSelectedListener(this);
  36. spin_two.setOnItemSelectedListener(this);
  37. }
  38. @Override
  39. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
  40. switch (parent.getId()){
  41. case R.id.spin_one:
  42. if(one_selected){
  43. Toast.makeText(mContext,"您的分段是~:" + parent.getItemAtPosition(position).toString(),
  44. Toast.LENGTH_SHORT).show();
  45. }else one_selected = true;
  46. break;
  47. case R.id.spin_two:
  48. if(two_selected){
  49. TextView txt_name = (TextView) view.findViewById(R.id.txt_name);
  50. Toast.makeText(mContext,"您选择的英雄是~:" + txt_name.getText().toString(),
  51. Toast.LENGTH_SHORT).show();
  52. }else two_selected = true;
  53. break;
  54. }
  55. }
  56. @Override
  57. public void onNothingSelected(AdapterView<?> parent) {
  58. }
  59. }

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


3.代码示例下载:

SpinnerDemo.zip


本节小结

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

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注