分享

Spinner的三种用法

 太极混元天尊 2018-05-19

方式一、如果是固定的数据,直接在values下创建arrays.xml


resources>
   string-array name='letter'>
       item>Aitem>
       item>Bitem>
       item>Citem>
       item>Ditem>
       item>Eitem>
       item>Fitem>
       item>Gitem>
   string-array>
resources>

然后在布局文件里通过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;i30;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



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多