android下拉框_android多选下拉框 - CSDN
精华内容
参与话题
  • android完美下拉框控件

    2020-07-29 19:11:11
    android完美下拉框控件android完美下拉框控件android完美下拉框控件android完美下拉框控件
  • android中自定义下拉框

    万次阅读 热门讨论 2013-07-09 12:09:08
    android自带的下拉框好用不?我觉得有时候好用,有时候难有,项目规定这样的效果,自带的控件实现不了,那么只有我们自己来老老实实滴写一个新的了,其实最基本的下拉框就像一些资料填写时,点击的时候出现在编辑框...

    android自带的下拉框好用不?我觉得有时候好用,有时候难有,项目规定这样的效果,自带的控件实现不了,那么只有我们自己来老老实实滴写一个新的了,其实最基本的下拉框就像一些资料填写时,点击的时候出现在编辑框的下面,然后又很多选项的下拉框,可是我在网上找了一下,没有这种下拉框额,就自己写了一个,看效果图先:

    ,这个是资料填写的一部分界面,三个下拉框,选择故乡所在地;


    点击之后弹出下拉框,选择下面的选项;

    三个下拉框时关联的,第一个决定了第二数据内容,第二个决定了第三个数据内容,如果三个全部选好之后,再次点击第一个,那么第二个、第三个都会清空,点击第二个则第三个会清空。





    要实现它,也就是一个PopupWindow时主要的界面,下面来看看代码:

    创建一个DefineSpinnerView.java文件,继承至View,然后给出如下属性:

        /**
         * 用于弹出的下拉框
         */
        private PopupWindow pWindow = null;
    
        // **************************************************************************
        // 这些是用来当点击一个时,根据他们之间的关系来显示下拉框中的内容
        // **************************************************************************
        /**
         * 祖父
         */
        private DefineSpinnerView gradeParent = null;
        /**
         * 父控件
         */
        private DefineSpinnerView parents = null;
        /**
         * 子控件
         */
        private DefineSpinnerView child1 = null;
        /**
         * 孙子控件
         */
        private DefineSpinnerView child2 = null;
    
        private Context context = null;
        private OptionsAdapter adapter = null; // 下拉框适配器
        private List<String> datas = null; // 下拉框数据
        private RelativeLayout layout = null; // 父控件
        private TextView text = null; // 文本显示
        private ImageView image = null; // 下拉箭头
        private int p_width = -1; // 下拉框宽度
        private ListView list = null; // 下拉表

    在构造函数中,构造出一个TextView和一个ImageView控件,并将它们都添加到layout中,代码如下:

    TextListener lis = new TextListener();
            text = new TextView(context);
            text.setBackgroundResource(R.drawable.edit_normal);
            text.setTextColor(getResources().getColor(R.color.spinner_text));
            text.setGravity(Gravity.CENTER);
            text.setOnClickListener(lis);
            LayoutParams params1 = new LayoutParams(width, hight);
            params1.leftMargin = left;
            params1.topMargin = top;
    
            image = new ImageView(context);
            image.setBackgroundResource(R.drawable.gerendang_jiantou);
            image.setOnClickListener(lis);
            if (LoginAct.MACHINE_PIXELS == IFinalConstant.XHDPI_RESOLUTION) {
                text.setTextSize(20.0f);
                LayoutParams params2 = new LayoutParams(19, 17);
                params2.topMargin = top + 15;
                params2.leftMargin = left + width - 28;
                map.put(image, params2);
            } else {
                text.setTextSize(15.0f);
                LayoutParams params2 = new LayoutParams(8, 8);
                params2.topMargin = top + 13;
                params2.leftMargin = left + width - 16;
                map.put(image, params2);
            }
    
            map.put(text, params1);

    里面涉及到一个TextListener内部类,是我们自己定义的一个类,它继承至OnClickListener接口

        /**
         * @author ZYJ
         *         当点击Text时,根据上一级的内容来设置下一级的内容
         */
        class TextListener implements OnClickListener {
            public void onClick(View v) {
            	hideSoft ();
                if (gradeParent != null && parents != null) {
                    DefineSpinnerView.this.setDatas(DefineSpinnerView.this
                            .getGuxiang3(gradeParent.getText(), parents.getText()));
                }
                if (gradeParent == null && parents != null) {
                    DefineSpinnerView.this.setDatas(DefineSpinnerView.this
                            .getGuxiang2(parents.getText()));
                }
                cleanText();
                changPopState(text);
            }
        

    这个里面调用了一个方法changPopState,它的定义如下:

        /**
         * 显示或者隐藏下拉框
         *
         * @param v
         */
        private void changPopState(View v) {
            if (pWindow == null) {
                popWindow(v);
                return;
            }
            if (!pWindow.isShowing()) {
                popWindow(v);
            } else {
                if (pWindow != null) {
                    pWindow.dismiss();
                }
            }
        }

    这个里面又调用了一个popWindow方法,定义如下:

    /**
         * 初始化下拉框
         *
         * @param par 父控件
         */
        private void popWindow(final View par) {
            if (pWindow == null) {
    
                // 布局文件
                View v = LayoutInflater.from(context).inflate(R.layout.list, null);
                list = (ListView) v.findViewById(R.id.list);
                list.setOnItemClickListener(new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> arg0, View arg1,
                                            int arg2, long arg3) {
                        // R.String.butian代表的是“不填”
                        if (datas.get(arg2).toString().equals(context.getString(R.string.butian))) {  
                            text.setText("");
                        } else {
                            text.setText(datas.get(arg2).toString()); // 将当前点击的item中的字符串显示出来
                        }
                        if (pWindow != null) { // 关闭下拉框
                            changPopState(par);
                        }
                    }
                });
                adapter = new OptionsAdapter(context, datas); // 根据数据,设置下拉框显示
                list.setAdapter(adapter);
                list.setDivider(null); // 屏蔽下拉框每个item之间的线条
                /**
                 * 两种不同长度的下拉框,主要是为了适应屏幕的大小
                 */
                if (p_width > 0) {
                    pWindow = new PopupWindow(v, par.getWidth(), 150);
                } else {
                    pWindow = new PopupWindow(v, par.getWidth(), 300);
                }
                pWindow.setFocusable(true);
                pWindow.setBackgroundDrawable(new BitmapDrawable());
                pWindow.setOutsideTouchable(true);
                pWindow.update();
            }
            pWindow.showAsDropDown(text);
        }


    然后是一些细节了,提供一个TextView设置上面文字和得到上面文字的方法,设置下拉框数据的方法setDatas,如下:

    public void setText(String str) {
            if (text != null) {
                text.setText(str);
            }
        }
    
        public void setDatas(List<String> datas) {
            this.datas = datas;
            if (adapter != null) {
                adapter.setDatas(datas);
                adapter.notifyDataSetInvalidated();
            }
        }
    
        public String getText() {
            if (text != null) {
                return text.getText().toString();
            }
            LoginAct.LogW("spinner's textView is null");
            return "";
        }
    
        private void cleanText() {
            if (child1 != null) {
                child1.text.setText("");
            }
            if (child2 != null) {
                child2.text.setText("");
            }
        }

    然后添加几个关联控件的get方法:

     public void setChild1(DefineSpinnerView child1) {
            this.child1 = child1;
        }
    
        public void setChild2(DefineSpinnerView child2) {
            this.child2 = child2;
        }
    
        public void setGradeParent(DefineSpinnerView gradeParent) {
            this.gradeParent = gradeParent;
        }
    
        public void setParents(DefineSpinnerView parents) {
            this.parents = parents;
        }
    
        public void setP_width(int p_width) {
            this.p_width = p_width;
        }

    接下来提供一个设置子控件和算子控件数据的方法:

    /**
         * @param s1 父控件中的字符串
         * @param s2 子控件中的字符串
         * @return 返回一个List<String>集合
         * @功能 通过父控件的字符串来设置子控件中的内容
         */
        private List<String> getGuxiang3(String s1, String s2) {
            List<String> dd = new ArrayList<String>();
            dd.add(context.getString(R.string.butian));
            Map<String, ArrayList<String>> mapTmp1 = MaterialView.cityMap.get(s1);
            if (mapTmp1 != null) {
                List<String> list = mapTmp1.get(s2);
                if (list != null) {
                    for (String str : list) {
                        dd.add(str);
                    }
                }
            }
            return dd;
        }
    
        /**
         * @param s 字符串
         * @return
         * @author ZYJ
         * @功能 设置父亲辈的下拉框中的内容
         */
        private List<String> getGuxiang2(String s) {
            List<String> dd = new ArrayList<String>();
            dd.add(context.getString(R.string.butian));
            Map<String, ArrayList<String>> mapTmp = MaterialView.cityMap.get(s);
            if (mapTmp != null) {
                for (String str : mapTmp.keySet()) {
                    dd.add(str);
                }
            }
            return dd;
        }

    最后提供一个隐藏软键盘的方法:

        private void hideSoft() {
    		InputMethodManager imm = (InputMethodManager) context
    				.getSystemService(Context.INPUT_METHOD_SERVICE);
    		imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT,
    				InputMethodManager.HIDE_NOT_ALWAYS);
    	}

    到这里,自定义控件的代码基本上写完了;我们还要来看看下拉框中的xml布局和适配器的写法:

    xml文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  xmlns:tools="http://schemas.android.com/tools"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="horizontal">
    
        <TextView
                android:id="@+id/info"
                android:layout_width="wrap_content"
                android:layout_height="30dp"
                android:textSize="15sp"
                android:textColor="@color/spinner_text"
                android:layout_gravity="center"
                android:gravity="center"/>
    
    </LinearLayout>


    然后是适配器类(OptionsAdapter),看全部代码吧:

    public class OptionsAdapter extends BaseAdapter {
    
        private Context context = null;
        private List<String> datas = null;
    
        public OptionsAdapter(Context context, List<String> d) {
            this.context = context;
            this.datas = d;
        }
    
        public int getCount() {
            return datas.size();
        }
    
        public Object getItem(int arg0) {
            return datas.get(arg0);
        }
    
        public long getItemId(int arg0) {
            return arg0;
        }
    
        /**
         * @author ZYJ
         * @功能 一个简单TextView显示
         */
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            View view = LayoutInflater.from(context).inflate(R.layout.childlist,
                    null);
            TextView textStr = (TextView) view.findViewById(R.id.info);
            textStr.setText("\t" + getItem(arg0).toString());
            return view;
        }
    
        public void setDatas(List<String> datas) {
            this.datas = datas;
        }
    
    }


    这样,上面的功能基本上都实现了,我的这个控件在我项目中是手动添加上去的,而不是定义在xml文件中的,所以也不知道定义在xml文件中能不能生效,各位尽管试试吧。








    展开全文
  • android下拉框

    2019-11-20 21:46:21
    下拉列表的方式 layout中的.xml文件 <Spinner android:id="@+id/Spinner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:entries="@array/ctype" ...

    下拉列表的方式

    layout中的.xml文件
     <Spinner 
            android:id="@+id/Spinner"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:entries="@array/ctype"
            />
    
    value中定义arrays.xml文件
    <resources>
        	<string-array name="ctype">
        	    <item>全部</item>
        	    <item>电影</item>
        	     <item>美食</item>
        	      <item>旅游</item>
        	</string-array>
    </resources>
    

    第二种方式在java代码中进行定义

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //数据绑定自定义下拉布局文件,并且为每列设置下拉列布局,相当Listview
            String[] ctype = new String[]{"全部","电影","美食","旅游"};
            ArrayAdapter<String> adpter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,ctype);
            adpter.setDropDownViewResource(android.R.layout.simple_spinner_item);
            
            //获取Spinner组件,
            Spinner spinner = (Spinner) findViewById(R.id.Spinner);
            spinner.setAdapter(adpter);
            
            //获取选中列的值。
            String str = spinner.getSelectedItem().toString();
            Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
        }
    }
    
    展开全文
  • Android自定义的下拉列表框控件

    万次阅读 2020-08-10 10:40:47
    Android中的有个原生的下拉列表控件Spinner,但是这个控件有时候不符合我们自己的要求, 比如有时候我们需要类似windows 或者web网页中常见的那种下拉列表控件,类似下图这样的: 这个时候只有自己动手...

    一、概述

    Android中的有个原生的下拉列表控件Spinner,但是这个控件有时候不符合我们自己的要求,

    比如有时候我们需要类似windows 或者web网页中常见的那种下拉列表控件,类似下图这样的:

     

     

     

    这个时候只有自己动手写一个了。其实实现起来不算很难,

    本文实现的方案是采用TextView +ImageView+PopupWindow的组合方案。

    先来看看我们的自己写的控件效果图吧:(源码在文章下面最后给出哈!)

     

    二、自定义下拉列表框控件的实现

    1. 自定义控件用到的布局文件和资源:

    结果框的布局页面:dropdownlist_view.xml:


     

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:id="@+id/compound"
        android:background="@drawable/dropdown_bg_selector" >
        
        <TextView
            android:id="@+id/text"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:paddingLeft="10dp"
            android:text="文本文字"
            android:gravity="center_vertical"
            android:textSize="14sp"
            android:padding="5dp"
            android:singleLine="true" />
        <ImageView 
            android:id="@+id/btn"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_toRightOf="@+id/text"
            android:src="@drawable/dropdown"
            android:padding="5dp"
            android:layout_centerVertical="true"
            android:gravity="center"/>
    </RelativeLayout>
    复制代码

     

    下拉弹窗列表布局页面:dropdownlist_popupwindow.xml:

    复制代码
    <?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="match_parent"
        android:orientation="vertical" >
        
        <ListView
            android:id="@+id/listView"
            android:layout_width="280dp"
            android:layout_height="wrap_content"
            android:divider="#666666"
            android:dividerHeight="1dp"
             ></ListView>
    
    </LinearLayout>
    复制代码

    selector资源文件:

    dropdown_list_selector.xml:

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

    dropdown_bg_selector.xml:

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

     

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:id="@+id/compound"
        android:background="@drawable/dropdown_bg_selector" >
        
        <TextView
            android:id="@+id/text"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:paddingLeft="10dp"
            android:text="文本文字"
            android:gravity="center_vertical"
            android:textSize="14sp"
            android:padding="5dp"
            android:singleLine="true" />
        <ImageView 
            android:id="@+id/btn"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_toRightOf="@+id/text"
            android:src="@drawable/dropdown"
            android:padding="5dp"
            android:layout_centerVertical="true"
            android:gravity="center"/>
    </RelativeLayout>
    复制代码

     

    下拉弹窗列表布局页面:dropdownlist_popupwindow.xml:

    复制代码
    <?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="match_parent"
        android:orientation="vertical" >
        
        <ListView
            android:id="@+id/listView"
            android:layout_width="280dp"
            android:layout_height="wrap_content"
            android:divider="#666666"
            android:dividerHeight="1dp"
             ></ListView>
    
    </LinearLayout>
    复制代码

    selector资源文件:

    dropdown_list_selector.xml:

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

    dropdown_bg_selector.xml:

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

     

     

    2. 自定义下拉列表框控件类的实现:

     

    我们采用了TextView+ImageView+PopupWindow的组合方案,所以我的自定义控件需要重写ViewGroup,由于我们已经知道了,布局方向为竖直方向,所以这里,

    我直接继承LinearLayout来写这个控件。具体实现代码如下:

    复制代码
    package com.czm.xcdropdownlistview;
    
    import java.util.ArrayList;
    
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.widget.TextView;
    
    @SuppressLint("NewApi")
    /**
     * 下拉列表框控件
     * @author caizhiming
     *
     */
    public class XCDropDownListView extends LinearLayout{
    
        private TextView editText;
        private ImageView imageView;
        private PopupWindow popupWindow = null;
        private ArrayList<String> dataList =  new ArrayList<String>();
        private View mView;
        public XCDropDownListView(Context context) {
            this(context,null);
            // TODO Auto-generated constructor stub
        }
        public XCDropDownListView(Context context, AttributeSet attrs) {
            this(context, attrs,0);
            // TODO Auto-generated constructor stub
        }
        public XCDropDownListView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
            initView();
        }
    
        public void initView(){
            String infServie = Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater layoutInflater;
            layoutInflater =  (LayoutInflater) getContext().getSystemService(infServie);
            View view  = layoutInflater.inflate(R.layout.dropdownlist_view, this,true);
            editText= (TextView)findViewById(R.id.text);
            imageView = (ImageView)findViewById(R.id.btn);
            this.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if(popupWindow == null ){
                        showPopWindow();
                    }else{
                        closePopWindow();
                    }
                }
            });
        }
        /**
         * 打开下拉列表弹窗
         */
        private void showPopWindow() {  
            // 加载popupWindow的布局文件  
            String infServie = Context.LAYOUT_INFLATER_SERVICE;
            LayoutInflater layoutInflater;
            layoutInflater =  (LayoutInflater) getContext().getSystemService(infServie);
            View contentView  = layoutInflater.inflate(R.layout.dropdownlist_popupwindow, null,false);
            ListView listView = (ListView)contentView.findViewById(R.id.listView);
            
            listView.setAdapter(new XCDropDownListAdapter(getContext(), dataList));
            popupWindow = new PopupWindow(contentView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
            popupWindow.setBackgroundDrawable(getResources().getDrawable(R.color.transparent));
            popupWindow.setOutsideTouchable(true);
            popupWindow.showAsDropDown(this);
        }
        /**
         * 关闭下拉列表弹窗
         */
        private void closePopWindow(){
            popupWindow.dismiss();
            popupWindow = null;
        }
        /**
         * 设置数据
         * @param list
         */
        public void setItemsData(ArrayList<String> list){
            dataList = list;
            editText.setText(list.get(0).toString());
        }
        /**
         * 数据适配器
         * @author caizhiming
         *
         */
        class XCDropDownListAdapter extends BaseAdapter{
    
            Context mContext;
            ArrayList<String> mData;
            LayoutInflater inflater;
            public XCDropDownListAdapter(Context ctx,ArrayList<String> data){
                mContext  = ctx;
                mData = data;
                inflater = LayoutInflater.from(mContext);
            }
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return mData.size();
            }
    
            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return null;
            }
    
            @Override
            public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                // TODO Auto-generated method stub
                // 自定义视图
                ListItemView listItemView = null;
                if (convertView == null) {
                    // 获取list_item布局文件的视图
                    convertView = inflater.inflate(R.layout.dropdown_list_item, null);
                    
                    listItemView = new ListItemView();
                    // 获取控件对象
                    listItemView.tv = (TextView) convertView
                            .findViewById(R.id.tv);
    
                    listItemView.layout = (LinearLayout) convertView.findViewById(R.id.layout_container);
                    // 设置控件集到convertView
                    convertView.setTag(listItemView);
                } else {
                    listItemView = (ListItemView) convertView.getTag();
                }
                
                // 设置数据
                listItemView.tv.setText(mData.get(position).toString());
                final String text = mData.get(position).toString();
                listItemView.layout.setOnClickListener(new OnClickListener() {
                    
                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        editText.setText(text);
                        closePopWindow();
                    }
                });
                return convertView;
            }
        
        }
        private static class ListItemView{
            TextView tv;
            LinearLayout layout;
        }
    
    }
    复制代码

     

    三、如何使用该自定义下拉列表框控件

    使用该控件和使用普通的自带的控件一样,首先需要在布局文件中引用该控件:

    复制代码
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.czm.xcdropdownlistview.MainActivity"
        tools:ignore="MergeRootFrame" >
        
        
        <com.czm.xcdropdownlistview.XCDropDownListView
            android:id="@+id/drop_down_list_view"
            android:layout_marginTop="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true" />
        
        </RelativeLayout>
    复制代码

    其次,就是在代码中使用该控件:

    复制代码
    package com.czm.xcdropdownlistview;
    
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.os.Bundle;
    /**
     * 使用下拉列表框控件 示例
     * @author caizhiming
     *
     */
    public class MainActivity extends Activity {
    
        XCDropDownListView dropDownListView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dropDownListView = (XCDropDownListView)findViewById(R.id.drop_down_list_view);
            ArrayList<String> list = new ArrayList<String>();
            for(int i = 0;i< 6;i++){
                list.add("下拉列表项"+(i+1));
            }
            dropDownListView.setItemsData(list);
    
        }
    
    }
    复制代码

    对了,这个控件中,我没有实现点击item项回调接口,这个可能对有些写惯了回调的可能觉得少了写什么的感觉,有兴趣的你可以自己添加相关回调操作哈,这个大家应该都会把。

    四、源码下载

    最后给出源码的下载:
    http://download.csdn.net/download/u013068887/10031736

    本文参考:
    http://www.cnblogs.com/JczmDeveloper/p/4425010.html

     

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:id="@+id/compound"
        android:background="@drawable/dropdown_bg_selector" >
        
        <TextView
            android:id="@+id/text"
            android:layout_width="250dp"
            android:layout_height="40dp"
            android:paddingLeft="10dp"
            android:text="文本文字"
            android:gravity="center_vertical"
            android:textSize="14sp"
            android:padding="5dp"
            android:singleLine="true" />
        <ImageView 
            android:id="@+id/btn"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_toRightOf="@+id/text"
            android:src="@drawable/dropdown"
            android:padding="5dp"
            android:layout_centerVertical="true"
            android:gravity="center"/>
    </RelativeLayout>
    复制代码

    下拉弹窗列表布局页面:dropdownlist_popupwindow.xml:

    复制代码
    <?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="match_parent"
        android:orientation="vertical" >
        
        <ListView
            android:id="@+id/listView"
            android:layout_width="280dp"
            android:layout_height="wrap_content"
            android:divider="#666666"
            android:dividerHeight="1dp"
             ></ListView>
    
    </LinearLayout>
    复制代码

    selector资源文件:

    dropdown_list_selector.xml:

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

    dropdown_bg_selector.xml:

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

     

     

    展开全文
  • Android自定义spinner下拉框实现的实现

    万次阅读 热门讨论 2016-07-16 12:12:56
    说道android下拉框spineer,框架中虽有现成的控件,但实际效果可能并不是我们所需要的那种,如下图: 其实我们更需要的是像WEB那种风格,如图所示: 其实实现也很简单,就是自定义个popwindow就可以了...

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

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

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

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

    下面贴上代码片段:

    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. }  
    主界面调用代码:

    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.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

    1. public abstract class AbstractSpinerAdapter<T> extends BaseAdapter {  
    2.   
    3.     public static interface IOnItemSelectListener{  
    4.         public void onItemClick(int pos);  
    5.     };  
    6.       
    7.      private Context mContext;     
    8.      private List<T> mObjects = new ArrayList<T>();  
    9.      private int mSelectItem = 0;  
    10.           
    11.      private LayoutInflater mInflater;  
    12.       
    13.      public  AbstractSpinerAdapter(Context context){  
    14.          init(context);  
    15.      }  
    16.        
    17.      public void refreshData(List<T> objects, int selIndex){  
    18.          mObjects = objects;  
    19.          if (selIndex < 0){  
    20.              selIndex = 0;  
    21.          }  
    22.          if (selIndex >= mObjects.size()){  
    23.              selIndex = mObjects.size() - 1;  
    24.          }  
    25.            
    26.          mSelectItem = selIndex;  
    27.      }  
    28.        
    29.      private void init(Context context) {  
    30.             mContext = context;  
    31.             mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    32.      }  
    33.           
    34.           
    35.     @Override  
    36.     public int getCount() {  
    37.   
    38.         return mObjects.size();  
    39.     }  
    40.   
    41.     @Override  
    42.     public Object getItem(int pos) {  
    43.         return mObjects.get(pos).toString();  
    44.     }  
    45.   
    46.     @Override  
    47.     public long getItemId(int pos) {  
    48.         return pos;  
    49.     }  
    50.   
    51.     @Override  
    52.     public View getView(int pos, View convertView, ViewGroup arg2) {  
    53.          ViewHolder viewHolder;  
    54.            
    55.          if (convertView == null) {  
    56.              convertView = mInflater.inflate(R.layout.spiner_item_layout, null);  
    57.              viewHolder = new ViewHolder();  
    58.              viewHolder.mTextView = (TextView) convertView.findViewById(R.id.textView);  
    59.              convertView.setTag(viewHolder);  
    60.          } else {  
    61.              viewHolder = (ViewHolder) convertView.getTag();  
    62.          }  
    63.   
    64.            
    65.          Object item =  getItem(pos);  
    66.          viewHolder.mTextView.setText(item.toString());  
    67.   
    68.          return convertView;  
    69.     }  
    70.   
    71.     public static class ViewHolder  
    72.     {  
    73.         public TextView mTextView;  
    74.     }  
    75.   
    76.   
    77. }


     

    SpinerPopWindow

    1. public class SpinerPopWindow extends PopupWindow implements OnItemClickListener{  
    2.   
    3.     private Context mContext;  
    4.     private ListView mListView;  
    5.     private AbstractSpinerAdapter 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.     public void setAdatper(AbstractSpinerAdapter adapter){  
    23.         mAdapter = adapter;  
    24.         mListView.setAdapter(mAdapter);   
    25.     }  
    26.   
    27.       
    28.     private void init()  
    29.     {  
    30.         View view = LayoutInflater.from(mContext).inflate(R.layout.spiner_window_layout, null);  
    31.         setContentView(view);         
    32.         setWidth(LayoutParams.WRAP_CONTENT);  
    33.         setHeight(LayoutParams.WRAP_CONTENT);  
    34.           
    35.         setFocusable(true);  
    36.         ColorDrawable dw = new ColorDrawable(0x00);  
    37.         setBackgroundDrawable(dw);  
    38.       
    39.           
    40.         mListView = (ListView) view.findViewById(R.id.listview);  
    41.         mListView.setOnItemClickListener(this);  
    42.     }  
    43.       
    44.       
    45.     public <T> void refreshData(List<T> list, int selIndex)  
    46.     {  
    47.         if (list != null && selIndex  != -1)  
    48.         {  
    49.             if (mAdapter != null){  
    50.                 mAdapter.refreshData(list, selIndex);  
    51.             }         
    52.         }  
    53.     }  
    54.   
    55.   
    56.     @Override  
    57.     public void onItemClick(AdapterView<?> arg0, View view, int pos, long arg3) {  
    58.         dismiss();  
    59.         if (mItemSelectListener != null){  
    60.             mItemSelectListener.onItemClick(pos);  
    61.         }  
    62.     }  
    63.   
    64.   
    65.       
    66. }  


    CustemObject

    1. <span style="color:#3366ff;">public class CustemObject {  
    2.   
    3.     public String data = "";  
    4.       
    5.     @Override  
    6.     public String toString() {  
    7.         // TODO Auto-generated method stub  
    8.         return data;  
    9.     }  
    10.   
    11.       
    12. }</span>  

     

    CustemSpinerAdapter

    1. public class CustemSpinerAdapter extends AbstractSpinerAdapter<CustemObject>{  
    2.   
    3.     public CustemSpinerAdapter(Context context) {  
    4.         super(context);  
    5.     }  
    6.   
    7. }  



    SpinerWindowDemoActivity

    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<CustemObject> nameList = new ArrayList<CustemObject>();  
    8.     private AbstractSpinerAdapter mAdapter;  
    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.             CustemObject object = new CustemObject();  
    30.             object.data = names[i];  
    31.             nameList.add(object);  
    32.         }  
    33.           
    34.           
    35.         mAdapter = new CustemSpinerAdapter(this);  
    36.         mAdapter.refreshData(nameList, 0);  
    37.   
    38.         mSpinerPopWindow = new SpinerPopWindow(this);  
    39.         mSpinerPopWindow.setAdatper(mAdapter);  
    40.         mSpinerPopWindow.setItemListener(this);  
    41.     }  
    42.   
    43.   
    44.     @Override  
    45.     public void onClick(View view) {  
    46.         switch(view.getId()){  
    47.         case R.id.bt_dropdown:  
    48.             showSpinWindow();  
    49.             break;  
    50.         }  
    51.     }  
    52.       
    53.   
    54.     private void setHero(int pos){  
    55.         if (pos >= 0 && pos <= nameList.size()){  
    56.             CustemObject value = nameList.get(pos);  
    57.           
    58.             mTView.setText(value.toString());  
    59.         }  
    60.     }  
    61.   
    62.       
    63.     private SpinerPopWindow mSpinerPopWindow;  
    64.     private void showSpinWindow(){  
    65.         Log.e("""showSpinWindow");  
    66.         mSpinerPopWindow.setWidth(mTView.getWidth());  
    67.         mSpinerPopWindow.showAsDropDown(mTView);  
    68.     }  
    69.   
    70.   
    71.     @Override  
    72.     public void onItemClick(int pos) {  
    73.         setHero(pos);  
    74.     }  
    75.   
    76. }  


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

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

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

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

    展开全文
  • Android:实现下拉列表 Spinner

    千次阅读 2019-06-05 08:25:11
    ...select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>...这是在Web开发中一个必不可少的交互性组件,而在Android中的对应实现就是Spinner。 方法一: 以资源方式,静态展示 Spi...
  • android的下拉列表框

    千次阅读 2012-12-02 20:03:20
    功能的话和那个单选按钮有些类似。这次的话就使用这个下拉列表框做一个城市和区域联动的小例子,数据的话简单起见就弄成静态的。就不先扯淡了。 1.先来看下下拉列表框的... android:prompt="@string/city_label" an
  • Android 简单下拉框

    千次阅读 2018-10-11 10:20:36
    1.在布局文件中添加一个Spinner布局,并设置相关属性 ... android:id="@+id/spiner_select" android:layout_width="0dp" android:layout_height="wrap_content" android:layout...
  • android 手动实现可输入下拉框Spinner控件(工具类)

    千次阅读 热门讨论 2020-07-29 20:39:01
    android 是自带有下拉框spinner控件的,但是android原生的Spinner控件是不支持用户输入的(据我所知),仅仅支持在数据列表确定的情况下进行选择。所以要实现一个手动输入的下拉框,我们需要自己手动实现...
  • Android自定义下拉框的简单实现

    千次阅读 2018-04-19 09:03:08
    安卓自带的Spinner不会用啊,换个图片都好麻烦,更别提做各种自定义的效果了自己尝试...具体实现:1.自定义控件(这里使用LinearLayout,在线性布局末尾添加一个ImageView,并对ImageView设置)public class Custom...
  • android实现![图片说明](https://img-ask.csdn.net/upload/201506/05/1433517357_451269.png)![图片说明](https://img-ask.csdn.net/upload/201506/05/1433517434_974578.png) 要实现:选择相应的学期,点击查询...
  • Android第三方开源下拉框:NiceSpinner

    万次阅读 2016-06-01 10:29:08
    Android原生的下拉框Spinner基本上可以满足Android开发对于下拉选项的设计需求,但现在越来越流行的下拉框不满足于Android原生提供的下拉框Spinner所提供的设计样式,而改用自定制或者第三方设计的下拉框Spinner。...
  • android自定义spinner下拉框实现(封装更通用)

    千次下载 热门讨论 2020-07-30 23:32:34
    博文参考:http://blog.csdn.net/geniuseoe2012/article/details/8723702 android仿web风格的spinner下拉框实现demo,实现更通用
  • 关于Droid X的手机,用户反应说,在下拉列表中字体颜色变成白色,所以字体看不见,除非用户突出显示这一项。其他的手机没有出现这个问题... new ArrayAdapter(this,android.R.layout.simple_spinner_item, spin_arry);
  • Android-下拉框,利用AlertDialog来实现

    千次阅读 2012-10-19 15:06:16
    利用Spinner可以实现下拉框,效果如下 其实完全可以用AlertDialog来实现。 AlertDialog有一个方法:public AlertDialog.Builder setAdapter (ListAdapter adapter, DialogInterface.OnClickListener ...
  • 好看的8种下拉列表

    千次阅读 2019-07-04 12:43:50
    第一种 第二种 第三种 第四种 第五种 第六种 第七种 第八种 插件下载
  • 一、改变高度  // 建立数据源  final String[] mItems = getResources().getStringArray(R.array.liushuispinnername);  // 建立Adapter并且绑定数据源 ... ArrayAdapter _Adapter=new ArrayAdapter(this,R....
  • Android改变Spinner弹出框的位置

    千次阅读 2018-11-05 16:27:24
    android:dropDownHorizontalOffset=“50dp”,水平位移单位 android:dropDownVerticalOffset="-50dp",竖直位移单位 &lt;Spinner android:id="@+id/spinner" android:layout_width="...
  • Android spinner下拉框和dialog

    千次阅读 2016-07-09 21:37:00
    spinner使用下拉框而不是dialog需要加上一条属性即可android:spinnerMode="dropdown"Dialog 请放弃使用Theme.Dialog应该使用 @android:style/Theme.Holo.DialogWhenLarge
  • Android自定义单选多选下拉列表

    千次阅读 2017-07-29 13:01:22
    发疯的产品要做一个可以单选和多选的下拉列表,陪你玩玩吧。直接上效果。实现方案:我的思路是自定义一个类继承PopupWindow,里面的选项采用Listview,再结合一些动画来实现。核心代码。
1 2 3 4 5 ... 20
收藏数 6,051
精华内容 2,420
关键字:

android下拉框