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

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

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

下面贴上代码片段:

[java] view plain copy print ?
  1. publicclassSpinerPopWindowextendsPopupWindowimplementsOnItemClickListener{
  2. privateContextmContext;
  3. privateListViewmListView;
  4. privateNormalSpinerAdaptermAdapter;
  5. privateIOnItemSelectListenermItemSelectListener;
  6. publicSpinerPopWindow(Contextcontext)
  7. {
  8. super(context);
  9. mContext=context;
  10. init();
  11. }
  12. publicvoidsetItemListener(IOnItemSelectListenerlistener){
  13. mItemSelectListener=listener;
  14. }
  15. privatevoidinit()
  16. {
  17. Viewview=LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout,null);
  18. setContentView(view);
  19. setWidth(LayoutParams.WRAP_CONTENT);
  20. setHeight(LayoutParams.WRAP_CONTENT);
  21. setFocusable(true);
  22. ColorDrawabledw=newColorDrawable(0x00);
  23. setBackgroundDrawable(dw);
  24. mListView=(ListView)view.findViewById(R.id.listview);
  25. mAdapter=newNormalSpinerAdapter(mContext);
  26. mListView.setAdapter(mAdapter);
  27. mListView.setOnItemClickListener(this);
  28. }
  29. publicvoidrefreshData(List<String>list,intselIndex)
  30. {
  31. if(list!=null&&selIndex!=-1)
  32. {
  33. mAdapter.refreshData(list,selIndex);
  34. }
  35. }
  36. @Override
  37. publicvoidonItemClick(AdapterView<?>arg0,Viewview,intpos,longarg3){
  38. dismiss();
  39. if(mItemSelectListener!=null){
  40. mItemSelectListener.onItemClick(pos);
  41. }
  42. }
  43. }
主界面调用代码:

[java] view plain copy print ?
  1. publicclassSpinerWindowDemoActivityextendsActivityimplementsOnClickListener,AbstractSpinerAdapter.IOnItemSelectListener{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. privateViewmRootView;
  4. privateTextViewmTView;
  5. privateImageButtonmBtnDropDown;
  6. privateList<String>nameList=newArrayList<String>();
  7. @Override
  8. publicvoidonCreate(BundlesavedInstanceState){
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. setupViews();
  12. }
  13. privatevoidsetupViews(){
  14. mRootView=findViewById(R.id.rootView);
  15. mTView=(TextView)findViewById(R.id.tv_value);
  16. mBtnDropDown=(ImageButton)findViewById(R.id.bt_dropdown);
  17. mBtnDropDown.setOnClickListener(this);
  18. String[]names=getResources().getStringArray(R.array.hero_name);
  19. for(inti=0;i<names.length;i++){
  20. nameList.add(names[i]);
  21. }
  22. mSpinerPopWindow=newSpinerPopWindow(this);
  23. mSpinerPopWindow.refreshData(nameList,0);
  24. mSpinerPopWindow.setItemListener(this);
  25. }
  26. @Override
  27. publicvoidonClick(Viewview){
  28. switch(view.getId()){
  29. caseR.id.bt_dropdown:
  30. showSpinWindow();
  31. break;
  32. }
  33. }
  34. privatevoidsetHero(intpos){
  35. if(pos>=0&&pos<=nameList.size()){
  36. Stringvalue=nameList.get(pos);
  37. mTView.setText(value);
  38. }
  39. }
  40. privateSpinerPopWindowmSpinerPopWindow;
  41. privatevoidshowSpinWindow(){
  42. Log.e("","showSpinWindow");
  43. mSpinerPopWindow.setWidth(mTView.getWidth());
  44. mSpinerPopWindow.showAsDropDown(mTView);
  45. }
  46. @Override
  47. publicvoidonItemClick(intpos){
  48. setHero(pos);
  49. }
  50. }

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

下面附上工程链接:

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


welcome to join android-develop group:298044305

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

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

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

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

AbstractSpinerAdapter

[java] view plain copy print ?
  1. <SPANstyle="COLOR:#3366ff">publicabstractclassAbstractSpinerAdapter<T>extendsBaseAdapter{
  2. publicstaticinterfaceIOnItemSelectListener{
  3. publicvoidonItemClick(intpos);
  4. };
  5. privateContextmContext;
  6. privateList<T>mObjects=newArrayList<T>();
  7. privateintmSelectItem=0;
  8. privateLayoutInflatermInflater;
  9. publicAbstractSpinerAdapter(Contextcontext){
  10. init(context);
  11. }
  12. publicvoidrefreshData(List<T>objects,intselIndex){
  13. mObjects=objects;
  14. if(selIndex<0){
  15. selIndex=0;
  16. }
  17. if(selIndex>=mObjects.size()){
  18. selIndex=mObjects.size()-1;
  19. }
  20. mSelectItem=selIndex;
  21. }
  22. privatevoidinit(Contextcontext){
  23. mContext=context;
  24. mInflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  25. }
  26. @Override
  27. publicintgetCount(){
  28. returnmObjects.size();
  29. }
  30. @Override
  31. publicObjectgetItem(intpos){
  32. returnmObjects.get(pos).toString();
  33. }
  34. @Override
  35. publiclonggetItemId(intpos){
  36. returnpos;
  37. }
  38. @Override
  39. publicViewgetView(intpos,ViewconvertView,ViewGrouparg2){
  40. ViewHolderviewHolder;
  41. if(convertView==null){
  42. convertView=mInflater.inflate(R.layout.spiner_item_layout,null);
  43. viewHolder=newViewHolder();
  44. viewHolder.mTextView=(TextView)convertView.findViewById(R.id.textView);
  45. convertView.setTag(viewHolder);
  46. }else{
  47. viewHolder=(ViewHolder)convertView.getTag();
  48. }
  49. Objectitem=getItem(pos);
  50. viewHolder.mTextView.setText(item.toString());
  51. returnconvertView;
  52. }
  53. publicstaticclassViewHolder
  54. {
  55. publicTextViewmTextView;
  56. }
  57. }</SPAN>


SpinerPopWindow

[java] view plain copy print ?
  1. publicclassSpinerPopWindowextendsPopupWindowimplementsOnItemClickListener{
  2. privateContextmContext;
  3. privateListViewmListView;
  4. privateAbstractSpinerAdaptermAdapter;
  5. privateIOnItemSelectListenermItemSelectListener;
  6. publicSpinerPopWindow(Contextcontext)
  7. {
  8. super(context);
  9. mContext=context;
  10. init();
  11. }
  12. publicvoidsetItemListener(IOnItemSelectListenerlistener){
  13. mItemSelectListener=listener;
  14. }
  15. publicvoidsetAdatper(AbstractSpinerAdapteradapter){
  16. mAdapter=adapter;
  17. mListView.setAdapter(mAdapter);
  18. }
  19. privatevoidinit()
  20. {
  21. Viewview=LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout,null);
  22. setContentView(view);
  23. setWidth(LayoutParams.WRAP_CONTENT);
  24. setHeight(LayoutParams.WRAP_CONTENT);
  25. setFocusable(true);
  26. ColorDrawabledw=newColorDrawable(0x00);
  27. setBackgroundDrawable(dw);
  28. mListView=(ListView)view.findViewById(R.id.listview);
  29. mListView.setOnItemClickListener(this);
  30. }
  31. public<T>voidrefreshData(List<T>list,intselIndex)
  32. {
  33. if(list!=null&&selIndex!=-1)
  34. {
  35. if(mAdapter!=null){
  36. mAdapter.refreshData(list,selIndex);
  37. }
  38. }
  39. }
  40. @Override
  41. publicvoidonItemClick(AdapterView<?>arg0,Viewview,intpos,longarg3){
  42. dismiss();
  43. if(mItemSelectListener!=null){
  44. mItemSelectListener.onItemClick(pos);
  45. }
  46. }
  47. }


CustemObject

[java] view plain copy print ?
  1. <SPANstyle="COLOR:#3366ff">publicclassCustemObject{
  2. publicStringdata="";
  3. @Override
  4. publicStringtoString(){
  5. //TODOAuto-generatedmethodstub
  6. returndata;
  7. }
  8. }</SPAN>

CustemSpinerAdapter

[java] view plain copy print ?
  1. publicclassCustemSpinerAdapterextendsAbstractSpinerAdapter<CustemObject>{
  2. publicCustemSpinerAdapter(Contextcontext){
  3. super(context);
  4. }
  5. }



SpinerWindowDemoActivity

[java] view plain copy print ?
  1. publicclassSpinerWindowDemoActivityextendsActivityimplementsOnClickListener,AbstractSpinerAdapter.IOnItemSelectListener{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. privateViewmRootView;
  4. privateTextViewmTView;
  5. privateImageButtonmBtnDropDown;
  6. privateList<CustemObject>nameList=newArrayList<CustemObject>();
  7. privateAbstractSpinerAdaptermAdapter;
  8. @Override
  9. publicvoidonCreate(BundlesavedInstanceState){
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. setupViews();
  13. }
  14. privatevoidsetupViews(){
  15. mRootView=findViewById(R.id.rootView);
  16. mTView=(TextView)findViewById(R.id.tv_value);
  17. mBtnDropDown=(ImageButton)findViewById(R.id.bt_dropdown);
  18. mBtnDropDown.setOnClickListener(this);
  19. String[]names=getResources().getStringArray(R.array.hero_name);
  20. for(inti=0;i<names.length;i++){
  21. CustemObjectobject=newCustemObject();
  22. object.data=names[i];
  23. nameList.add(object);
  24. }
  25. mAdapter=newCustemSpinerAdapter(this);
  26. mAdapter.refreshData(nameList,0);
  27. mSpinerPopWindow=newSpinerPopWindow(this);
  28. mSpinerPopWindow.setAdatper(mAdapter);
  29. mSpinerPopWindow.setItemListener(this);
  30. }
  31. @Override
  32. publicvoidonClick(Viewview){
  33. switch(view.getId()){
  34. caseR.id.bt_dropdown:
  35. showSpinWindow();
  36. break;
  37. }
  38. }
  39. privatevoidsetHero(intpos){
  40. if(pos>=0&&pos<=nameList.size()){
  41. CustemObjectvalue=nameList.get(pos);
  42. mTView.setText(value.toString());
  43. }
  44. }
  45. privateSpinerPopWindowmSpinerPopWindow;
  46. privatevoidshowSpinWindow(){
  47. Log.e("","showSpinWindow");
  48. mSpinerPopWindow.setWidth(mTView.getWidth());
  49. mSpinerPopWindow.showAsDropDown(mTView);
  50. }
  51. @Override
  52. publicvoidonItemClick(intpos){
  53. setHero(pos);
  54. }
  55. }


自定义一个类重写toString方法(CustemObject),自定义一个继承自AbstractSpinerAdapter的类确定对象类型(CustemSpinerAdapter)

构造具体的AbstractSpinerAdapter类对象(CustemSpinerAdapter)

通过refreshData填充数据,然后调用SpinerPopWindow的setAdatper设置数据源,OK大功告成!

新工程链接如下:http://download.csdn.net/detail/geniuseoe2012/5412647

更多相关文章

  1. Android打电话过程
  2. Android系统java层次service实现
  3. 三、数据库入门和listview的基本使用
  4. Android中OkHttp的使用(详解)
  5. android 加载自定义图片并在图片上绘图
  6. Android中怎么启动关闭Service及功能解释 .
  7. Android(安卓)setBackgroundResource()/setBackgroundDrawable()
  8. Android(安卓)MediaPlayer的生命周期
  9. Android四大组件介绍

随机推荐

  1. EditText设置更多文字为省略号
  2. Android Java调用ffmpeg命令
  3. android 播放默认铃声和手机振动
  4. Android自适应屏幕大小和layout布局
  5. Android世界:android 线程池
  6. Android ThreadLocal及InheritableThread
  7. Android(安卓)bound service 详解
  8. Android获取webView快照与屏幕截屏的方法
  9. android命令行下创建虚拟设备avd
  10. Android 资源简介(四) ClipDrawable