原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0615/544.html
	一、参考
	1、android Spinner控件详解
	2、非常新Spinner用法详解
	二、实例
	1、普通的spinner用法及在string-array中的数据加载,此UI是在MD样式下,在差别Theme下其实是有差别UI展现,也可选定下拉形式是:dropdown大概dialog,默认是dropdown的
	1-2.png
	结构:
	        <!--非常简略的加载下拉数组:entries,内容定义在string-array中-->
	        <Spinner
	            android:id="@+id/spinner_simple"
	            android:layout_marginTop="10dp"
	            android:layout_width="200dp"
	            android:layout_height="50dp"
	            android:entries="@array/study_view_spinner_values" />
	2、接下来变更下样式:1、数据变更 2、选中后添补笔墨居中变红 3、下拉笔墨居中变绿 4、种种宽度高度控制等
	留意:在ArrayAdapter中加载的自定义结构必须是textview,不然会报异常:ArrayAdapter requires the resource ID to be a TextView
	1-3.png
	1-4.png
	代码:
	/**
	     * Spinner自定义样式
	     * 1、Spinner内的TextView样式:item_select
	     * 2、Spinner下拉中每个item的TextView样式:item_drop
	     * 3、Spinner下拉框样式,属性设置
	     * */
	    public void ChangeSpinner(View v){
	        mSpinnerSimple.setDropDownWidth(400); //下拉宽度
	        mSpinnerSimple.setDropDownHorizontalOffset(100); //下拉的横向偏移
	        mSpinnerSimple.setDropDownVerticalOffset(100); //下拉的纵向偏移
	        //mSpinnerSimple.setBackgroundColor(AppUtil.getColor(instance,R.color.wx_bg_gray)); //下拉的布景色
	        //spinner mode : dropdown or dialog , just edit in layout xml
	        //mSpinnerSimple.setPrompt("Spinner Title"); //弹出框标题,在dialog下有用
	        String[] spinnerItems = {"10","200","400"};        //自定义选定添补后的字体样式
	        //只能是textview样式,不然报错:ArrayAdapter requires the resource ID to be a TextView
	        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(instance,
	                R.layout.item_select, spinnerItems);        //自定义下拉的字体样式
	        spinnerAdapter.setDropDownViewResource(R.layout.item_drop);        //这个在差别的Theme下,表现的结果是差别的
	        //spinnerAdapter.setDropDownViewTheme(Theme.LIGHT);
	        mSpinnerSimple.setAdapter(spinnerAdapter);
	    }
	结构:item_select.xml
	<?xml version="1.0" encoding="utf-8"?><TextView
	    xmlns:android="http://schemas.android.com/apk/res/android"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:gravity="center"
	    android:textColor="@color/red"
	    android:textSize="@dimen/normal_text_size"/>
	结构:item_drop.xml
	<?xml version="1.0" encoding="utf-8"?><TextView
	    xmlns:android="http://schemas.android.com/apk/res/android"
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:padding="10dp"
	    android:gravity="center"
	    android:textColor="@color/green"
	    android:textSize="@dimen/normal_text_size"/>
	3、spinner结构中设置种种属性,完成结果,并增长监听,监听留意是AdapterView.OnItemSelectedListener是这个哦,监听内部的回调回笼值各个意思在代码注释中,默认来说简略的加载结构就两个:android.R.layout.simple_spinner_item----android.R.layout.simple_spinner_dropdown_item
	2-2.png
	结构:
	<!--
	            代码加载下拉数组,种种属性,及其监听
	            1、是下拉照旧弹出框
	            spinnerMode="dropdown"
	            spinnerMode="dialog"
	            2、下拉宽度:默认宽度和spinner差未几,去掉左边的下拉按钮宽度
	            dropDownWidth="xxdp"
	            3、下拉布景色
	            popupBackground="resColor/resMipmap"
	            4、布景色:会遮住默认右边的下拉按钮
	            background="resColor/resMipmap"
	        -->
	        <Spinner
	            android:id="@+id/spinner_1"
	            android:layout_marginTop="10dp"
	            android:layout_width="160dp"
	            android:layout_height="160dp"
	            android:gravity="center"
	            android:spinnerMode="dropdown"
	            android:dropDownWidth="80dp"
	            android:popupBackground="@color/wx_blue"
	            android:background="@color/white"
	            />
	代码:这里会有选定监听
	/**
	     * 测试:加载数据列,监听选定
	     * */
	    private void testSpinner1(){        //原始string数组
	        final String[] spinnerItems = {"张三","李四","王二麻子"};        //简略的string数组适配器:样式res,数组
	        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(instance,
	                android.R.layout.simple_spinner_item, spinnerItems);        //下拉的样式res
	        spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);        //绑定 Adapter到控件
	        mSpinner1.setAdapter(spinnerAdapter);        //选定监听
	        mSpinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {            //parent即是父控件spinner
	            //view即是spinner内添补的textview,id=@android:id/text1
	            //position是值所在数组的地位
	            //id是值所在行的地位,普通来说与positin一致
	            @Override
	            public void onItemSelected(AdapterView<?> parent, View view,                                       int pos, long id) {
	                LogUtil.i("onItemSelected : parent.id="+parent.getId()+                        ",isSpinnerId="+(parent.getId() == R.id.spinner_1)+                        ",viewid="+view.getId()+ ",pos="+pos+",id="+id);
	                ToastUtil.showShort(instance,"选定了["+spinnerItems[pos]+"]");                //设置spinner内的添补笔墨居中
	                //((TextView)view).setGravity(Gravity.CENTER);
	            }            @Override
	            public void onNothingSelected(AdapterView<?> parent) {                // Another interface callback
	            }
	        });
	    }
	4、彻底自定义的spinner:基本上皆代码完成了,自定义adapter绑定List<T>和dropdown结构文件,而后spinner加载adapter适配器
	3-1.png
	3-2.png
	代码:
	//CarBean就不贴出来了/**
	     * Spinner彻底自定义UI和绑定命据
	     * */
	    private void testSpinnerSelf(){
	        ArrayList<CarBean> cars = new ArrayList<>();
	        CarBean car = new CarBean();
	        car.setBrand("玛莎拉蒂");
	        car.setOwner("张三");
	        car.setCost("100万");
	        cars.add(car);
	        car = new CarBean();
	        car.setBrand("宝马");
	        car.setOwner("李四");
	        car.setCost("53万");
	        cars.add(car);        final CarAdapter adapter = new CarAdapter(instance,cars);
	        mSpinnerSelf.setAdapter(adapter);
	        mSpinnerSelf.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {            @Override
	            public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
	                ToastUtil.showShort(instance,((CarBean)adapter.getItem(pos)).toString());
	            }            @Override
	            public void onNothingSelected(AdapterView<?> parent) {
	            }
	        });
	    }
	代码:CarAdapter
	public class CarAdapter extends BaseAdapter {    private Context ctx;    private LayoutInflater li;    private ArrayList<CarBean> dataList;    public CarAdapter(Context ctx,ArrayList<CarBean> dataList) {        this.ctx = ctx;        this.li = LayoutInflater.from(ctx);        this.dataList = dataList;
	    }    
	    @Override
	    public int getCount() {        return dataList.size();
	    }    @Override
	    public CarBean getItem(int position) {        return dataList.get(position);
	    }    @Override
	    public long getItemId(int position) {        return position;
	    }    @Override
	    public View getView(final int position, View convertView, ViewGroup parent) {        if (convertView == null) {
	            convertView = View.inflate(ctx, R.layout.item_car, null);            new ViewHolder(convertView);
	        } 
	        ViewHolder holder = (ViewHolder) convertView.getTag();// get convertView's holder
	        holder.car_brand.setText(getItem(position).getBrand());
	        holder.car_owner.setText(getItem(position).getOwner());
	        holder.car_cost.setText(getItem(position).getCost());        
	        return convertView;
	    }     class ViewHolder {
	        TextView car_brand;
	        TextView car_owner;
	        TextView car_cost;        
	        public ViewHolder(View convertView){
	            car_brand = (TextView) convertView.findViewById(R.id.tv_car_brand);
	            car_owner = (TextView) convertView.findViewById(R.id.tv_car_owner);
	            car_cost = (TextView) convertView.findViewById(R.id.tv_car_cost);
	            convertView.setTag(this);//set a viewholder
	        }
	    }
	}
	结构文件:item_car.xml,会发现,在spinner选中后果添补控件和dropdown下拉控件上都用的是此结构
	<?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="wrap_content"
	    android:orientation="horizontal"
	    android:background="?android:attr/selectableItemBackground"
	    android:padding="10dp">
	    <ImageView
	        android:id="@+id/iv_car"
	        android:layout_width="30dp"
	        android:layout_height="30dp"
	        android:src="@mipmap/car"/>
	    <TextView
	        android:id="@+id/tv_car_brand"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_marginStart="10dp"
	        android:textSize="@dimen/normal_text_size"/>
	    <TextView
	        android:id="@+id/tv_car_owner"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_marginStart="10dp"
	        android:textSize="@dimen/normal_text_size"/>
	    <TextView
	        android:id="@+id/tv_car_cost"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_marginStart="10dp"
	        android:textSize="@dimen/normal_text_size"/></LinearLayout>
	2018年第一篇,感受写的简略,有望列位看官喜好。
上篇:上一篇:在fragment中援用ListView
下篇:下一篇:Android中Toast若何在子线程中用

