Spinner 取消默认选中

实现如下功能:Spinner初始不选中,显示“请选择:”,具体效果图参考下面

XML布局文件:

main.xml(主布局文件):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
        android:id="@+id/txtView"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello">
    </TextView>
    <!-- 系统自带标准Spinner,与自定义Spinner比较 -->
    <Spinner
        android:id="@+id/androidspinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </Spinner>
    <!-- 自定义Spinner -->
    <com.hisoft.spinnertest.CustomSpinner
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:drawSelectorOnTop="false">
    </com.hisoft.spinnertest.CustomSpinner>
    <Button
        android:id="@+id/btnOK"
        android:text="OK"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </Button>
</LinearLayout>


spinner_item.xml(CustomSpinner的每个Item的布局,包括一个TextView和RadioButton):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/spinner_ll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/spinner_item_style">
    <TextView
        android:id="@+id/spinner_txt"
        android:layout_width="wrap_content"
        android:layout_height="62dip"
        android:gravity="center_vertical"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="5dip"
        android:textSize="17sp"
        android:textColor="@color/black">
    </TextView>
    <RadioButton
        android:id="@+id/spinner_radio"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_alignParentRight="true"
        android:layout_marginRight="5dip"
        android:clickable="false">
    </RadioButton>
</RelativeLayout>


spinner_item_style.xml(CustomSpinner的每个Item的式样,放在drawable文件夹下,其中highlight_pressed.9.png可从android-sdk-windows\platforms\android-8\data\res\drawable-mdpi下找到):

<?xml version="1.0" encoding="UTF-8"?>  
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/highlight_pressed" />
    <item android:drawable="@color/white" />
</selector>


java代码:

public class main extends Activity{
    
    private TextView mtxtView;
     // android自带标准Spinner
    private Spinner mAndroidSpinner;
     // 自定义Spinner
    private CustomSpinner mSpinner;
    private Button mbtnOK;
    
    private ArrayAdapter<String> androidAdapter;
    private MyAdapter<String> adapter;
    private List<String> list;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mtxtView = (TextView)findViewById(R.id.txtView);
        mAndroidSpinner = (Spinner)findViewById(R.id.androidspinner);
        mSpinner = (CustomSpinner)findViewById(R.id.spinner);
        mbtnOK = (Button)findViewById(R.id.btnOK);
        
        mtxtView.setText("Init");
        
        mbtnOK.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                 // 获取CustomSpinner选中的哪一项,-1表示没有选中
                int nSelect = mSpinner.getSelectedItemPosition();
                if (nSelect == -1)
                {
                    Toast.makeText(main.this, "请选中一项!", Toast.LENGTH_LONG).show();
                }
                else
                {
                    String str = "" + nSelect;
                    Toast.makeText(main.this, str, Toast.LENGTH_LONG).show();
                }
                
            }
        });
        
        list = new ArrayList<String>();
        list.add("请选择:");
        list.add("Mercury");
        list.add("test2");
        list.add("test3");
        list.add("test4");
        list.add("test5");
        list.add("test6");
        list.add("test7");
        list.add("test8");
        list.add("test9");
        list.add("test10");
        list.add("test11");
        list.add("test12");
        list.add("test13");
        list.add("test14");
        list.add("test15");
        list.add("test16");
        list.add("test17");
        list.add("test18");
        
        androidAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,
                list);
        androidAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
        adapter = new MyAdapter<String>(this, android.R.layout.simple_spinner_item,
                list);
        
        mAndroidSpinner.setAdapter(androidAdapter);
        mAndroidSpinner.setPrompt("测试");
        
        mSpinner.setAdapter(adapter);
        mSpinner.setPrompt("测试");
    }
    
    private class MyAdapter<T> extends ArrayAdapter<T>
    {
        private LayoutInflater mInflater;
        private ViewHolder holder;
        private View rootView = null;
        private SpinnerHandler handler;
        
        public MyAdapter(Context context, int textViewResourceId, List<T> objects) {
            super(context, textViewResourceId, objects);
            
            handler = new SpinnerHandler();
            mInflater = (LayoutInflater) ((Activity) context)
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
             // 在下拉列表中不要显示“请选择:”这一项,所以要将总数减1
            return list.size() - 1;
        }

         // 获取下拉列表的view
        @Override
        public View getDropDownView(int position, View convertView,
                ViewGroup parent) {

            if (null == convertView)
            {
                 // 将下拉列表的每个item用spinner_item.xml布局
                convertView = mInflater.inflate(R.layout.spinner_item, null);
                holder = new ViewHolder();
                
                holder.txt = (TextView)convertView.findViewById(R.id.spinner_txt);
                holder.radio = (RadioButton)convertView.findViewById(R.id.spinner_radio);
                 // 给item添加点击事件,,dismiss下拉列表
                convertView.setOnClickListener(new OnClickListener() {
                    
                    @Override
                    public void onClick(View v) {
                        
                        ViewHolder vh = (ViewHolder) v.getTag();
                        Log.d("MyAdapter", "onClick index = " + vh.index);
                         // 将RadioButton选中
                        vh.radio.setChecked(true);
                         // 设置Spinner第几项被选中了
                        mSpinner.setSelection(vh.index);
                        adapter.notifyDataSetChanged();
                         // 获取下拉列表的主窗口句柄
                        rootView = v.getRootView();
                         // 延迟100毫秒dismiss下拉列表
                        handler.sendEmptyMessageDelayed(1, 100);
                    }
                });
                
                convertView.setTag(holder);
            }
            else
            {
                holder = (ViewHolder) convertView.getTag();
            }
             // 下拉列表中要去掉“请选择:”项,所以要“position + 1”
            holder.txt.setText(list.get(position + 1));
            holder.index = position;
             // 设置RadioButton的选中状态
            if (mSpinner.getSelectedItemPosition() == position)
            {
                holder.radio.setChecked(true);
            }
            else
            {
                holder.radio.setChecked(false);
            }
            
            return convertView;
        }

         // 获取控件view
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            int nPos = 0;
            
            int nIndex = mSpinner.getSelectedItemPosition();
             // 如果没有选中,返回“请选择:”,否则返回选中项
            if (nIndex == -1)
            {
                nPos = 0;
            }
            else
            {
                nPos = position + 1;
            }
            
            return super.getView(nPos, convertView, parent);
        }
        
        private class ViewHolder
        {
            public int index;
            public TextView txt;
            public RadioButton radio;
        }
        
        private class SpinnerHandler extends Handler
        {

            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                switch (msg.what)
                {
                case 1:
                    if (null != rootView)
                    {
                        rootView.setVisibility(View.GONE);
                    }
                    break;
                default:
                    break;
                }
            }
        }
    }
}

// 自定义Spinner,目的只是为了记录下拉列表中哪一项被选中
public class CustomSpinner extends Spinner {
    
    private int mSelection = -1;
    
    public CustomSpinner(Context context) {
        super(context);
    }
    
    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomSpinner(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public void setSelection(int position) {
        
        mSelection = position;
        super.setSelection(position);
    }

    @Override
    public void setSelection(int position, boolean animate) {
        
        mSelection = position;
        super.setSelection(position, animate);
    }

    @Override
    public int getSelectedItemPosition() {
        return mSelection;
    }
}

程序运行的效果图:
主界面:

android自带标准spinner:

自定义Spinner:
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值