方式一、如果是固定的数据,直接在values下创建arrays.xml
A
B
C
D
E
F
G
然后在布局文件里通过android:entries引用就可以了
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:spinnerMode="dialog"
android:entries="@array/letter"
android:prompt="@string/spinner_title"/>
android:spinnerMode=”dialog”表示Spinner的样式是dialog,android:prompt可以设置dialog的标题(注意必须在string资源下引用,不然程序会崩掉)
方式二、通过适配器来填充参数,继承BaseAdapter,这种方式比较简单,网上也有很多参考,就不介绍了。
我们主要来介绍方式三:
实现SpinnerAdaper接口,其实跟继承BaseAdapter差不多,只不过有几个坑的地方需要注意:
先贴代码
public class MyAdapter implements SpinnerAdapter {
private ArrayList list;
private Context context;
public MyAdapter(ArrayList list, Context context) {
this.list = list;
this.context = context;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView== null){
holder= new ViewHolder();
convertView= LayoutInflater.from(context).inflate(R.layout.item,null);
holder.textView= convertView.findViewById(R.id.tv_name);
holder.imageView= convertView.findViewById(R.id.iv_image);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
holder.textView.setText(list.get(position));
holder.imageView.setImageResource(R.mipmap.ic_launcher);
return convertView;
}
@Override
public void registerDataSetObserver(DataSetObserver observer) {
}
@Override
public void unregisterDataSetObserver(DataSetObserver observer) {
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView== null){
holder= new ViewHolder();
convertView= LayoutInflater.from(context).inflate(R.layout.item,null);
holder.textView= convertView.findViewById(R.id.tv_name);
holder.imageView= convertView.findViewById(R.id.iv_image);
convertView.setTag(holder);
}else {
holder= (ViewHolder) convertView.getTag();
}
holder.textView.setText(list.get(position));
holder.imageView.setImageResource(R.mipmap.ic_launcher);
return convertView;
}
private class ViewHolder{
TextView textView;
ImageView imageView;
}
@Override
public int getItemViewType(int position) {
return 1;
}
@Override
public int getViewTypeCount() {
return 1;
}
@Override
public boolean isEmpty() {
return false;
}
需要注意:
注意1:
@Override
public int getItemViewType(int position) {
return 0;
}
@Override
public int getViewTypeCount() {
return 0;
}
getItemViewType和getViewTypeCount这两个方法,默认返回的是0,需要改为1。不然在setAdapter的时候就会报Caused by: java.lang.IllegalArgumentException: Spinner adapter view type count must be 1。
注意2:
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return null;
}
相比BaseAdapter,最大的不同是SpinnerAdapter多了getDropDownView方法,这里必须跟getView方法里写得一样,不然当你点击Spinner控件的时候,程序也会崩溃。
好了,下面贴上MainActivity的代码:
public class MainActivity extends AppCompatActivity {
@BindView(R.id.spinner)
Spinner spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
ArrayList list= new ArrayList<>();
for (int i=0;i<30;i++){
list.add("Name"+i);
}
MyAdapter myAdapter= new MyAdapter(list,this);
spinner.setAdapter(myAdapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
String str = (String) spinner.getSelectedItem();
Toast.makeText(MainActivity.this, "选择了" + str, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView> parent) {
Log.e("TAG_MainActivity", parent.toString());
}
});
}
}
下面分别是使用arrays.xml和SpinnerAdapter的效果图:
github地址:https://github.com/HeJiaomy/SpinnerDemo