Spinner:下拉选择
简单介绍一个Android中的下拉选择控件:Spinner,别看它小巧,用处靠发挥开发者的创造力,比如搜索输入框中不断更新的提示词可以用Spinner。源码路径:frameworks/base/core/java/android/widget/Spinner.java

1、Spinner
在布局中添加Spinner
<Spinner
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/mediastore" />2、Spinner数据
下拉选择得有选项,这些数据有多种方式添加到Spinner中。下面介绍:
2.1、Spinner数据
在布局中直接引用arrays.xml文件中定义的array数组:
<Spinner
...
android:entries="@array/mediastore" />/values/arrays.xml文件中定义的数组:
<resources>
<string-array name="mediastore">
<item>File</item>
<item>Audio</item>
<item>Video</item>
<item>Images</item>
<item>Downloads</item>
</string-array>
</resources>2.2、ArrayAdapter
Android系统中其实预设了很多基本的ArrayAdapter可以直接拿来适配简单的数据:String集合。
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, STRINGS);
mChoose.setAdapter(adapter);这里也直接使用了Android系统的布局android.R.layout.simple_list_item_1,其中只有一个TextView展示String字符串:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:minHeight="?android:attr/listPreferredItemHeightSmall" />2.3、SpinnerAdapter
Spinner提供了SpinnerAdapter接口Adapter,实现这个接口,实现里面的方法和普通的Adapter一样。
SpinnerAdapter定义如下,也是继承了Adapter接口:
public interface SpinnerAdapter extends Adapter {
public View getDropDownView(int position, View convertView, ViewGroup parent);
}自定义SpinnerAdapter只需实现上面的接口中的方法,例:
public class ChooseSpinnerAdapter implements SpinnerAdapter {
private List<String> mStringArrayList = new ArrayList<>();
private Context mContext;
public ChooseSpinnerAdapter(Context context) {
this.mContext = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = LayoutInflater.from(mContext).inflate(R.layout.spinner, null);
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View view = LayoutInflater.from(mContext).inflate(R.layout.spinner, null);
return view;
}
@Override
public int getCount() {
return mStringArrayList.size();
}
@Override
public String getItem(int position) {
return mStringArrayList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public int getItemViewType(int position) {
return 1;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
}其中的getDropDownView()方法获取下拉每个Item的View,getView()就是获取已选择的View,一般这两个方法内容是一样的。其次getItemViewType()和getViewTypeCount()方法获取类型,返回1即可。至于其它的方法和Adapter一样。
除此之外,可以发现还有另外一个Adapter:ThemedSpinnerAdapter,没有实际使用,从类名可以看出应该是和自定义下拉选择主题相关的Adapter。
推荐博客:

