Android自定义spinner下拉框实现的实现

               

请支持原创:http://blog.****.net/geniuseoe2012/article/details/8723702

说到android下拉框spineer,框架中虽有现成的控件,但实际效果可能并不是我们所需要的那种,如下图:

Android自定义spinner下拉框实现的实现

其实我们更需要的是像WEB那种风格,如图所示:

Android自定义spinner下拉框实现的实现

其实实现也很简单,就是自定义个popwindow就可以了

下面贴上代码片段:

[java] view plaincopy
  1. public class SpinerPopWindow extends PopupWindow implements OnItemClickListener{  
  2.   
  3.     private Context mContext;  
  4.     private ListView mListView;  
  5.     private NormalSpinerAdapter mAdapter;  
  6.     private IOnItemSelectListener mItemSelectListener;  
  7.       
  8.       
  9.     public SpinerPopWindow(Context context)  
  10.     {  
  11.         super(context);  
  12.           
  13.         mContext = context;  
  14.         init();  
  15.     }  
  16.       
  17.       
  18.     public void setItemListener(IOnItemSelectListener listener){  
  19.         mItemSelectListener = listener;  
  20.     }  
  21.   
  22.       
  23.     private void init()  
  24.     {  
  25.         View view = LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout, null);  
  26.         setContentView(view);         
  27.         setWidth(LayoutParams.WRAP_CONTENT);  
  28.         setHeight(LayoutParams.WRAP_CONTENT);  
  29.           
  30.         setFocusable(true);  
  31.         ColorDrawable dw = new ColorDrawable(0x00);  
  32.         setBackgroundDrawable(dw);  
  33.       
  34.           
  35.         mListView = (ListView) view.findViewById(R.id.listview);  
  36.           
  37.   
  38.         mAdapter = new NormalSpinerAdapter(mContext);     
  39.         mListView.setAdapter(mAdapter);   
  40.         mListView.setOnItemClickListener(this);  
  41.     }  
  42.       
  43.       
  44.     public void refreshData(List<String> list, int selIndex)  
  45.     {  
  46.         if (list != null && selIndex  != -1)  
  47.         {  
  48.             mAdapter.refreshData(list, selIndex);  
  49.         }  
  50.     }  
  51.   
  52.   
  53.     @Override  
  54.     public void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {  
  55.         dismiss();  
  56.         if (mItemSelectListener != null){  
  57.             mItemSelectListener.onItemClick(pos);  
  58.         }  
  59.     }  
  60.   
  61.   
  62.       
  63. }  
主界面调用代码:

[java] view plaincopy
  1. public class SpinerWindowDemoActivity extends Activity implements OnClickListener, AbstractSpinerAdapter.IOnItemSelectListener{  
  2.     /** Called when the activity is first created. */  
  3.       
  4.     private View mRootView;  
  5.     private TextView mTView;  
  6.     private ImageButton mBtnDropDown;  
  7.     private List<String> nameList = new ArrayList<String>();  
  8.   
  9.       
  10.     @Override  
  11.     public void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.main);  
  14.           
  15.         setupViews();  
  16.     }  
  17.       
  18.       
  19.     private void setupViews(){  
  20.         mRootView = findViewById(R.id.rootView);  
  21.           
  22.         mTView = (TextView) findViewById(R.id.tv_value);  
  23.         mBtnDropDown = (ImageButton) findViewById(R.id.bt_dropdown);  
  24.         mBtnDropDown.setOnClickListener(this);  
  25.           
  26.           
  27.         String[] names = getResources().getStringArray(R.array.hero_name);  
  28.         for(int i = 0; i < names.length; i++){  
  29.             nameList.add(names[i]);  
  30.         }  
  31.           
  32.   
  33.         mSpinerPopWindow = new SpinerPopWindow(this);  
  34.         mSpinerPopWindow.refreshData(nameList, 0);  
  35.         mSpinerPopWindow.setItemListener(this);  
  36.     }  
  37.   
  38.   
  39.     @Override  
  40.     public void onClick(View view) {  
  41.         switch(view.getId()){  
  42.         case R.id.bt_dropdown:  
  43.             showSpinWindow();  
  44.             break;  
  45.         }  
  46.     }  
  47.       
  48.   
  49.     private void setHero(int pos){  
  50.         if (pos >= 0 && pos <= nameList.size()){  
  51.             String value = nameList.get(pos);  
  52.           
  53.             mTView.setText(value);  
  54.         }  
  55.     }  
  56.   
  57.       
  58.     private SpinerPopWindow mSpinerPopWindow;  
  59.     private void showSpinWindow(){  
  60.         Log.e("""showSpinWindow");  
  61.         mSpinerPopWindow.setWidth(mTView.getWidth());  
  62.         mSpinerPopWindow.showAsDropDown(mTView);  
  63.     }  
  64.   
  65.   
  66.     @Override  
  67.     public void onItemClick(int pos) {  
  68.         setHero(pos);  
  69.     }  
  70.   
  71. }  

就这么简单,具体UI美化大家再修改下xml就可以了

下面附上工程链接:

http://download.****.net/detail/geniuseoe2012/5184664


welcome to join android-develop group:298044305

more brilliant,Please pay attention to my **** blog -->http://blog.****.net/geniuseoe2012

 

上一课Lance老师UI系列教程第六课->微信聊天气泡界面的实现

/*=============================================================================*/

为使SpinerPopWindow更为通用,特修改或增加以下几个类

AbstractSpinerAdapter

[java] view plaincopy
  1. public abstract class AbstractSpinerAdapter<T> extends BaseAdapter {  
  2.   
  3.     public static interface IOnItemSelectListener{  
  4.         public void onItemClick(int pos);