Android开发自定义下拉框下拉列表

来源:互联网 发布:编程入门视频 编辑:程序博客网 时间:2024/04/29 16:58

开发中难免有各种需求,近期项目中需要自定义下拉框的使用。实现效果如图,展开状态箭头向上,收起的时候箭头向下,选中状态选中条目颜色可变,可设置下拉框高度。效果如下


自定义CustomSpinner.java

public class CustomSpinner extends LinearLayout{    private View view;    private TextView tv_name;    private ImageView ib;    //界面控件    private ImageView spinner;    //构造qq号用到的集合    private List<String> list = new ArrayList<String>();    //布局加载器    //自定义适配器    private MyAdapter mAdapter;    //PopupWindow    private PopupWindow pop;    //是否显示PopupWindow,默认不显示    private boolean isPopShow = true;    private ListView listView;    private LayoutInflater mInflater;    private OnItemSelectedListenerSpinner onItemSelectedListener;    private int heiht;    private int postion = 0;    public CustomSpinner(Context context) {        super(context);        initView(context);    }    public CustomSpinner(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);        initView(context);    }    public CustomSpinner(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView(context);    }    public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {        super(context, attrs, defStyleAttr, defStyleRes);        initView(context);    }    private void initView(final Context context) {        mInflater = LayoutInflater.from(context);        view = mInflater.inflate(R.layout.layout_customspinner, null);        mAdapter = new MyAdapter();        tv_name = (TextView) view.findViewById(R.id.et_name);        ib = (ImageView) view.findViewById(R.id.spinner);        tv_name.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View view) {                L.e("isshow--"+isPopShow);                if (null != list){                    if(pop == null){                        listView = new ListView(context);                        listView.setCacheColorHint(0x00000000);                        listView.setDividerHeight(0);                        listView.setBackgroundColor(Color.rgb(255,255,255));                        listView.setAdapter(mAdapter);                        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {                            @Override                            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {                                postion = i;                                mAdapter.notifyDataSetChanged();                                tv_name.setText(list.get(i));                                ib.setImageResource(R.drawable.ic_arrow_drop_down_black_24dp);                                pop.dismiss();                                isPopShow = true;                                CustomSpinner.this.view.setTag(getId());                                onItemSelectedListener.onItemSelected(CustomSpinner.this.view,view,i,l);                            }                        });                        if (heiht == 0){                            int hei = setListViewHeightBasedOnChildren(listView);                            //这里设置下拉框的高度                            if (hei >= 550){                                pop = new PopupWindow(listView, CustomSpinner.this.view.getWidth(), 550, true);                            }else{                                pop = new PopupWindow(listView, CustomSpinner.this.view.getWidth(), hei, true);                            }                        }else{                            pop = new PopupWindow(listView, CustomSpinner.this.view.getWidth(),heiht, true);                        }                        pop.setBackgroundDrawable(new ColorDrawable(0x00000000));                        pop.setFocusable(true);                        pop.setOnDismissListener(new PopupWindow.OnDismissListener() {                            @Override                            public void onDismiss() {                                isPopShow = true;                                ib.setImageResource(R.drawable.ic_arrow_drop_down_black_24dp);                            }                        });                        ib.setImageResource(R.drawable.ic_arrow_drop_down_black_24dp_right);                        pop.showAsDropDown(view,0, 0);                        isPopShow = false;                    }else{                        if(isPopShow){                            ib.setImageResource(R.drawable.ic_arrow_drop_down_black_24dp_right); //向上的箭头                            pop.showAsDropDown(view, 0, 0);                            isPopShow = false;                        }else{                            ib.setImageResource(R.drawable.ic_arrow_drop_down_black_24dp); //向下的箭头                            pop.dismiss();                            isPopShow = true;                        }                    }                }                onClickCustom();            }        });        if (list == null || list.size() == 0){            tv_name.setText("");        }else{            tv_name.setText(list.get(0));        }        addView(view);    }    public static int setListViewHeightBasedOnChildren(ListView listView) {        // 获取ListView对应的Adapter        ListAdapter listAdapter = listView.getAdapter();        if (listAdapter == null) {            return 0;        }        int totalHeight = 0;        for (int i = 0; i < listAdapter.getCount(); i++) { // listAdapter.getCount()返回数据项的数目            View listItem = listAdapter.getView(i, null, listView);            listItem.measure(0, 0); // 计算子项View 的宽高            totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度        }        int ff = totalHeight                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));        return ff;    }    public void onClickCustom(){    }    public void attachDataSource(List<String> list){        this.list = list;        tv_name.setText(list.get(0));    }    public void setOnItemSelectedListener(OnItemSelectedListenerSpinner onItemSelectedListener){       this.onItemSelectedListener = onItemSelectedListener;        Log.e("www","走了");    }    public void setSpinnerHeiht(int heiht){        this.heiht = heiht;    }    public void setSelectedIndex(int index){        tv_name.setText(list.get(index));        onItemSelectedListener.onItemSelected(null,null,index,index);    }    private class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            // TODO Auto-generated method stub            return list.size();        }        @Override        public Object getItem(int position) {            // TODO Auto-generated method stub            return list.get(position);        }        @Override        public long getItemId(int position) {            // TODO Auto-generated method stub            return position;        }        @Override        public View getView(final int position, View convertView, ViewGroup parent) {            View view = mInflater.inflate(R.layout.item, null);            if (position == CustomSpinner.this.postion){                //选中条目的背景色                view.setBackgroundColor(Color.rgb(26,208,189));            }            final TextView tv_name = (TextView) view.findViewById(R.id.tv_name);            tv_name.setText(list.get(position));            //设置按钮的监听事件            view.setTag(tv_name);            return view;        }    }    @Override    public void destroyDrawingCache() {        if (pop != null && pop.isShowing()){            pop.dismiss();        }        super.destroyDrawingCache();    }}

//布局文件layout_customspinner

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="50dp"    android:gravity="center_vertical"    android:background="@color/white">    <ImageView        android:id="@+id/spinner"        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:src="@drawable/ic_arrow_drop_down_black_24dp"         android:paddingRight="2dp"        android:layout_alignParentRight="true"        />    <TextView        android:id="@+id/et_name"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:textColor="@color/black"        android:gravity="center"        android:clickable="true"        android:layout_toLeftOf="@id/spinner"        android:hint="数据加载中" /></RelativeLayout>

//布局item.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="horizontal"    android:gravity="center">    <TextView         android:id="@+id/tv_name"        android:layout_width="match_parent"        android:layout_height="30dp"        android:textSize="14sp"        android:gravity="center"        android:layout_marginRight="14dp"        android:text="aaaaa"        /></LinearLayout>

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 lg洗衣机洗完衣服门打不开怎么办 lg洗衣机不能冼衣服怎么办 vivo账户密码忘记了怎么办 oppo账户密码忘记了怎么办 74160从1开始计数怎么办 微信录音声音小怎么办 word文档已停止工作怎么办 怀孕30天不想要怎么办 一楼墙体起碱怎么办 农村平房顶四墙面渗水怎么办 被蝎子精蛰了怎么办 小娃头摔包要怎么办抹个什么 老人死了银行钱存死期怎么办 飙酷车神2一进画面就闪退怎么办 电脑开机键盘鼠标没反应怎么办 玩gta4自由城卡怎么办 gta5游戏服务当前不可用怎么办 健身后胳膊变粗怎么办 健身后手臂变粗怎么办 家猫见到我就跑怎么办 走路多了小腿酸痛怎么办 脚有脚气很痒怎么办 地板精油喷多了怎么办 史莱姆泥变硬了怎么办 dnf剑帝命中率低怎么办 无意中讲话伤害了人怎么办 高中上不下去了怎么办 高三坚持不下去怎么办 word点了不保存怎么办 做了ppt没保存怎么办 中班安全教案迷眼了怎么办 美的空调尘满怎么办 高考报名系统密码忘记怎么办 高考理综8题怎么办 高三了语文很差怎么办 高三了语文成绩差怎么办 供太岁初一忘了怎么办 高一英语100多分怎么办 高一孩子英语差怎么办 高考中题目有错别字怎么办 相亲简单自我介绍后不回我怎么办