android开发--Spinner

将相本无种,男儿当自强。这篇文章主要讲述android开发--Spinner相关的知识,希望能为你提供帮助。
Spinner 控件提供下拉列表式的输入方式,可有效地节省手机屏幕的显示空间。 与 ListView 类似,Spinner 控件也有设置数据适配器方法 setAdapter()、监听选择项方法  setOnItemSelectedListener()。 Spinner 比 ListView 多使用的一个方法是 setOnTouchListener(),用以实现触屏处理:当单击 Spinner 对象时才出现列表。

android开发--Spinner

文章图片
android开发--Spinner

文章图片
  一、一维下拉列表框  参考:Spinner的功能和用法 已经可以确定列表选择框里的列表项,只要为Spinner指定android:entries属性即可让Spinner正常工作;如果程序需要在程序运行时动态决定Spinner的列表项,或者程序需要对Spinner的列表项进行定制,则可使用Adapter提供列表项。 (1)android:entries i. 在 app/res/values/strings.xml 里的< resources> 标签内 添加已确定的列表值
< string-array name="spinnerList"> < item> 红楼梦< /item> < item> 西游记< /item> < item> 水浒传< /item> < item> 三国演义< /item> < /string-array>

  ii. 添加entries属性
< Spinner android:id="@+id/spinner" android:entries="@array/spinnerList" android:layout_width="match_parent" android:layout_height="wrap_content" />

android开发--Spinner

文章图片
 
(2)ArrayAdapter
public class MainActivity extends AppCompatActivity {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner myspinner=findViewById(R.id.spinner); String[] items=getResources().getStringArray(R.array.spinnerList); //这里用到上一个例子里的string-array //android.R.layout.simple_spinner_item 是系统自带spinner格式 ArrayAdapter< String> myadapter=new ArrayAdapter< String> (this,android.R.layout.simple_spinner_item,items); myspinner.setAdapter(myadapter); } }

 
android开发--Spinner

文章图片

(3)使用自定义spinner样式+ArrayAdapter  参考:轻松自定义spinner样式
首先在app/res/layout 右键单击layout文件夹New-> Layout Resource File-> [ File name:myspinner_layout ] -> ok,重复步骤再新建一个myspinner_layout_dropdown.xml作为点击后弹出的列表布局
myspinner_layout.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"> < ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="center_vertical" android:src="https://www.songbingjia.com/android/@mipmap/ic_launcher"/> < TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:singleLine="true" android:gravity="right" android:textSize="14sp"/> < /LinearLayout>

myspinner_layout_dropdown.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"> < ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="center_vertical" android:src="https://www.songbingjia.com/android/@mipmap/ic_launcher"/> < TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:paddingTop="5dp" android:paddingBottom="5dp" android:paddingLeft="8dp" android:textSize="30sp" android:singleLine="true" /> < /LinearLayout>

spinner
< Spinner android:id="@+id/spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" />

MainActivity.java
public class MainActivity extends AppCompatActivity {@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner myspinner=findViewById(R.id.spinner); String[] items=getResources().getStringArray(R.array.spinnerList); //当前目录文件与实际文件系统不同步时,新建的R.layout.myspinner_layout提示不存在,不要急,关掉studio再进来就好了. //ArrayAdapter< String> (Context context,int layoutResource,int textViewResourceId,String[] items) ArrayAdapter< String> myadapter=new ArrayAdapter< String> (this,R.layout.myspinner_layout,R.id.textView,items); myadapter.setDropDownViewResource(R.layout.myspinner_layout_dropdown); myspinner.setAdapter(myadapter); } }

点击前:
android开发--Spinner

文章图片
  点击后:
android开发--Spinner

文章图片

二、二维下拉列表框 【使用SimpleAdapter】
效果图如下,后面直接上代码
android开发--Spinner

文章图片
android开发--Spinner

文章图片

activity_main.xml
< ?xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" tools:context=".MainActivity"> < Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" /> < /LinearLayout>

  myspinner_layout.xml (这是自定义的二维i的spinner布局,有需要的可以再自定义一个弹出时的列表样式,具体方法参考一维列表第三个方法)
< ?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"> < TextView android:id="@+id/t1" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingTop="5dp" android:paddingLeft="5dp" android:paddingBottom="5dp" android:textSize="20sp"/> < TextView android:id="@+id/t2" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingTop="5dp" android:paddingLeft="5dp" android:paddingBottom="5dp" android:textSize="20sp"/> < TextView android:id="@+id/t3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:paddingTop="5dp" android:paddingLeft="5dp" android:paddingBottom="5dp" android:textSize="20sp"/> < /LinearLayout>

MainActivity.java
public class MainActivity extends AppCompatActivity { //先设置列表项key[即“ 属性” ] String[] keys={"bname","bauthor","bamount"}; //再设置每个列表项的values [即“ 属性值” ] String[] bname={"红楼梦","西游记","水浒传","三国演义"}; String[] bauthor={"曹雪芹","吴承恩","施耐庵","罗贯中"}; int[] bamount={20,10,13,18}; //item代表一条记录 Map< String,Object> item=null; //wholedata用来存放所有记录,形成一个表List List< Map< String,Object> > wholedata=https://www.songbingjia.com/android/new ArrayList< Map< String,Object> > (); //ids为整型数组,存放myspinner_layout.xml里三个textView的id int[] ids={R.id.t1,R.id.t2,R.id.t3}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int i,valuesNum; //valuesNum为总记录数(表中一行是一条记录) valuesNum=bname.length; //添加记录 for(i=0; i< valuesNum; i++){ item=new HashMap< > (); item.put(keys[0],bname[i]); item.put(keys[1],bauthor[i]); item.put(keys[2],bamount[i]); wholedata.add(item); } //为spinner设置SimpleAdapter Spinner myspinner=findViewById(R.id.spinner); //SimpleAdapter(Context context,List< Map< String,?> > data,int LayoutResource,String[] from,int[] idRes) SimpleAdapter myAdapter=new SimpleAdapter(this,wholedata,R.layout.myspinner_layout,keys,ids); myspinner.setAdapter(myAdapter); } }

 
三、再补充一个我觉得蛮实用的自定义的ArrayAdapter  参考:自定义Spinner样式以及实现hint效果
新建一个java文件,取名 myArrayAdapter.java
【android开发--Spinner】(这里以上面一维列表的第二种方法为例)
public class myArrayAdapter< T> extends ArrayAdapter {

public myArrayAdapter(@NonNull Context context, int resource, @NonNull Object[] objects) {
super(context, resource, objects);
}

@Override
public int getCount() {
int count= super.getCount();
return count > 0 ? count-1 : count;
}
}

  修改一维列表的第二种方法,使用myArrayAdapter上转型对象 
ArrayAdapter< String> myadapter=new myArrayAdapter< String> (this,android.R.layout.simple_spinner_item,items);
myspinner.setAdapter(myadapter);
myspinner.setSelection(items.length-1,true);

   修改app/res/values/strings.xml里设置的列表项,把最后一项设为需要hint的内容
< string-array name="spinnerList"> < item> 红楼梦< /item> < item> 西游记< /item> < item> 水浒传< /item> < item> 三国演义< /item> < item> 请选择你最喜欢的书籍< /item> < /string-array>

效果图如下:
点击前:
android开发--Spinner

文章图片
  点击后:
android开发--Spinner

文章图片

 
四、不管是哪一种Spinner都一样有的点击事件
  Spinner有  setOnItemClickListener 和 setOnClickListener,但是这两个方法目前都不可用,而setOnTouchListener是spinner被触摸时触发,只有setOnItemSelectedListener可以在点选列表项时被触发。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner myspinner=findViewById(R.id.spinner); final String[] items=getResources().getStringArray(R.array.spinnerList); ArrayAdapter< String> myadapter=new ArrayAdapter< String> (this,android.R.layout.simple_spinner_item,items); myspinner.setAdapter(myadapter); myspinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView< ?> parent, View view, int position, long id) { String selecteditem=null;
//下面是三个得到被点选项的内容的方法 //selecteditem=items[position]; //selecteditem=parent.getSelectedItem().toString(); selecteditem=parent.getItemAtPosition(position).toString(); Toast.makeText(getApplicationContext(),selecteditem,Toast.LENGTH_LONG).show(); }@Override public void onNothingSelected(AdapterView< ?> parent) { } }); } }

  效果图如下:
android开发--Spinner

文章图片


    推荐阅读