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

简介:

一:前言
本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去网上找到一份Demo,但是发现没有封装的好,并且还有很多重复的代码,于是我在这位前辈的基础上进行了修改.并且重新进行了封装,代码变得简单,并且具有可读性.

二:实现原理
1.就是一个TextView 弄一个弧形的背景图片,然后设置一个点击事件.
2.点击TextView之后显示一个PopupWindow,Popupwindow是自定义的,里面显示一个ListView.ListView也设置了左边.右边.底部的边框.


三:效果图如下



四:代码实现:

1).MainActivity.java  程序入口,初始化数据,初始化自定义PopupWIndow,TextView点击之后显示PopupWIndow,处理ListView的点击事件.

  1. /** 
  2.  * 主Activity  用来实现popupwindow 
  3.  * @author ansen 
  4.  */  
  5. public class MainActivity extends Activity {  
  6.     private SpinerPopWindow<String> mSpinerPopWindow;  
  7.     private List<String> list;  
  8.     private TextView tvValue;  
  9.   
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.         setContentView(R.layout.activity_main);  
  14.   
  15.         initData();  
  16.   
  17.         tvValue = (TextView) findViewById(R.id.tv_value);  
  18.         tvValue.setOnClickListener(clickListener);  
  19.         mSpinerPopWindow = new SpinerPopWindow<String>(this, list,itemClickListener);  
  20.         mSpinerPopWindow.setOnDismissListener(dismissListener);  
  21.     }  
  22.       
  23.     /** 
  24.      * 监听popupwindow取消 
  25.      */  
  26.     private OnDismissListener  dismissListener=new OnDismissListener() {  
  27.         @Override  
  28.         public void onDismiss() {  
  29.             setTextImage(R.drawable.icon_down);  
  30.         }  
  31.     };  
  32.   
  33.     /** 
  34.      * popupwindow显示的ListView的item点击事件 
  35.      */  
  36.     private OnItemClickListener itemClickListener = new OnItemClickListener() {  
  37.         @Override  
  38.         public void onItemClick(AdapterView<?> parent, View view, int position,long id) {  
  39.             mSpinerPopWindow.dismiss();  
  40.             tvValue.setText(list.get(position));  
  41.             Toast.makeText(MainActivity.this"点击了:" + list.get(position),Toast.LENGTH_LONG).show();  
  42.         }  
  43.     };  
  44.   
  45.     /** 
  46.      * 显示PopupWindow 
  47.      */  
  48.     private OnClickListener clickListener = new OnClickListener() {  
  49.         @Override  
  50.         public void onClick(View v) {  
  51.             switch (v.getId()) {  
  52.             case R.id.tv_value:  
  53.                 mSpinerPopWindow.setWidth(tvValue.getWidth());  
  54.                 mSpinerPopWindow.showAsDropDown(tvValue);  
  55.                 setTextImage(R.drawable.icon_up);  
  56.                 break;  
  57.             }  
  58.         }  
  59.     };  
  60.   
  61.     /** 
  62.      * 初始化数据 
  63.      */  
  64.     private void initData() {  
  65.         list = new ArrayList<String>();  
  66.         for (int i = 0; i < 5; i++) {  
  67.             list.add("test:" + i);  
  68.         }  
  69.     }  
  70.   
  71.     /** 
  72.      * 给TextView右边设置图片 
  73.      * @param resId 
  74.      */  
  75.     private void setTextImage(int resId) {  
  76.         Drawable drawable = getResources().getDrawable(resId);  
  77.         drawable.setBounds(00, drawable.getMinimumWidth(),drawable.getMinimumHeight());// 必须设置图片大小,否则不显示  
  78.         tvValue.setCompoundDrawables(nullnull, drawable, null);  
  79.     }  
  80. }  

2).activity_main.xml  这个文件也没啥好说的  就是两个TextView。
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.     <LinearLayout  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="wrap_content"  
  9.         android:layout_margin="5dp"  
  10.         android:orientation="horizontal">  
  11.   
  12.         <TextView  
  13.             android:id="@+id/tv_value"  
  14.             android:layout_width="0dp"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_weight="1"  
  17.             android:background="@drawable/shape_help_category_tv_bg"  
  18.             android:drawableRight="@drawable/icon_down"  
  19.             android:padding="10dp"  
  20.             android:textColor="@color/content_color"  
  21.             android:text="请选择父类别"  
  22.             android:textSize="20sp"/>  
  23.   
  24.         <TextView  
  25.             android:layout_marginLeft="5dp"  
  26.             android:layout_width="0dp"  
  27.             android:layout_height="wrap_content"  
  28.             android:layout_weight="1"  
  29.             android:background="@drawable/shape_help_category_tv_bg"  
  30.             android:drawableRight="@drawable/icon_down"  
  31.             android:textColor="@color/content_color"  
  32.             android:padding="10dp"  
  33.             android:text="请选择子类别"  
  34.             android:textSize="20sp" />  
  35.     </LinearLayout>  
  36. </LinearLayout>  


3).SpinerPopWindow.java  自定义Popupwindow类 初始化PopupWindow显示的布局,以及一些参数,并且给listView设置适配器

  1.  * 自定义PopupWindow  主要用来显示ListView  
  2.  * @author Ansen  
  3.  * @param <T>  
  4.  * @param <T>  
  5.  * @create time 2015-11-3  
  6.  */  
  7. public class SpinerPopWindow<T> extends PopupWindow {  
  8.     private LayoutInflater inflater;  
  9.     private ListView mListView;  
  10.     private List<T> list;  
  11.     private MyAdapter  mAdapter;  
  12.       
  13.     public SpinerPopWindow(Context context,List<T> list,OnItemClickListener clickListener) {  
  14.         super(context);  
  15.         inflater=LayoutInflater.from(context);  
  16.         this.list=list;  
  17.         init(clickListener);  
  18.     }  
  19.       
  20.     private void init(OnItemClickListener clickListener){  
  21.         View view = inflater.inflate(R.layout.spiner_window_layout, null);  
  22.         setContentView(view);         
  23.         setWidth(LayoutParams.WRAP_CONTENT);  
  24.         setHeight(LayoutParams.WRAP_CONTENT);  
  25.         setFocusable(true);  
  26.             ColorDrawable dw = new ColorDrawable(0x00);  
  27.         setBackgroundDrawable(dw);  
  28.         mListView = (ListView) view.findViewById(R.id.listview);  
  29.         mListView.setAdapter(mAdapter=new MyAdapter());  
  30.         mListView.setOnItemClickListener(clickListener);  
  31.     }  
  32.       
  33.     private class MyAdapter extends BaseAdapter{  
  34.         @Override  
  35.         public int getCount() {  
  36.             return list.size();  
  37.         }  
  38.   
  39.         @Override  
  40.         public Object getItem(int position) {  
  41.             return list.get(position);  
  42.         }  
  43.   
  44.         @Override  
  45.         public long getItemId(int position) {  
  46.             return position;  
  47.         }  
  48.   
  49.         @Override  
  50.         public View getView(int position, View convertView, ViewGroup parent) {  
  51.             ViewHolder holder=null;  
  52.             if(convertView==null){  
  53.                 holder=new ViewHolder();  
  54.                 convertView=inflater.inflate(R.layout.spiner_item_layout, null);  
  55.                 holder.tvName=(TextView) convertView.findViewById(R.id.tv_name);  
  56.                 convertView.setTag(holder);  
  57.             }else{  
  58.                 holder=(ViewHolder) convertView.getTag();  
  59.             }  
  60.             holder.tvName.setText(getItem(position).toString());  
  61.             return convertView;  
  62.         }  
  63.     }  
  64.       
  65.     private class ViewHolder{  
  66.         private TextView tvName;  
  67.     }  
  68. }  

4).spiner_window_layout.xml    PopupWindow显示的布局文件 里面就一个ListView控件
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:layout_alignParentRight="true"  
  6.     android:orientation="vertical">  
  7.   
  8.     <ListView  
  9.         android:id="@+id/listview"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:cacheColorHint="#00000000"  
  13.         android:background="@drawable/shape_popupwindow_list_bg"  
  14.         android:scrollbars="none" >  
  15.     </ListView>  
  16. </LinearLayout>  

还有一些其他布局,我就不一一贴出来了,有兴趣的可以去看看源码.这个Demo还是比较简单的,相信大家都能看懂.
推荐下自己创建的android QQ群:202928390 欢迎大家的加入.

点击下载源码

目录
相关文章
|
4月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
436 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
4月前
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
|
4月前
|
Android开发 开发者
Android自定义view之利用drawArc方法实现动态效果
本文介绍了如何通过Android自定义View实现动态效果,重点使用`drawArc`方法完成圆弧动画。首先通过`onSizeChanged`进行测量,初始化画笔属性,设置圆弧相关参数。核心思路是不断改变圆弧扫过角度`sweepAngle`,并调用`invalidate()`刷新View以实现动态旋转效果。最后附上完整代码与效果图,帮助开发者快速理解并实践这一动画实现方式。
136 0
|
4月前
|
Android开发 数据安全/隐私保护 开发者
Android自定义view之模仿登录界面文本输入框(华为云APP)
本文介绍了一款自定义输入框的实现,包含静态效果、hint值浮动动画及功能扩展。通过组合多个控件完成界面布局,使用TranslateAnimation与AlphaAnimation实现hint文字上下浮动效果,支持密码加密解密显示、去除键盘回车空格输入、光标定位等功能。代码基于Android平台,提供完整源码与attrs配置,方便复用与定制。希望对开发者有所帮助。
|
4月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
220 65
Android自定义view之网易云推荐歌单界面
|
4月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
544 84
|
4月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
4月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
111 3
|
4月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
Android自定义view之围棋动画(化繁为简)
|
10月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
151 1

热门文章

最新文章