自定义下拉选择框






1、效果所示  ,选中也可切换条目字体

自定义下拉选择框



2、java代码

package com.example.administrator.lefangtong.customview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.example.administrator.lefangtong.R;
import com.example.administrator.lefangtong.custominterface.OnItemSelectedListenerSpinner;
import com.example.administrator.lefangtong.utils.L;

import java.util.ArrayList;
import java.util.List;


/**
 * Created by Administrator on 2017/5/2 0002.
 */

public class CustomSpinner1 extends LinearLayout{

    private String titleText = "数据加载中";
    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;
    private boolean isFirst = true;
    private View viewP;

    public CustomSpinner1(Context context) {
        super(context);
        initView(context);
    }

    public CustomSpinner1(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public CustomSpinner1(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    public CustomSpinner1(final Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr);
        TypedArray array=context.obtainStyledAttributes(attrs, R.styleable.CustomSpinner);
        titleText=array.getString(R.styleable.CustomSpinner_hintText);
        array.recycle();
        if (titleText != null){
            tv_name.setText(titleText);
        }
    }

    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(final View view) {
                if (null != list){
                    if(pop == null){
                        listView = new ListView(context);
                        listView.setCacheColorHint(0x00000000);
                        listView.setDivider(new ColorDrawable(Color.rgb(199,199,199)));
                        listView.setDividerHeight(1);
                        listView.setBackgroundColor(Color.argb(0,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));
                                tv_name.setTextColor(Color.rgb(255,0,0));
                                ib.setImageResource(R.mipmap.xiala);
                                pop.dismiss();
                                isPopShow = true;
                                CustomSpinner1.this.view.setTag(getId());
                                if (null != onItemSelectedListener){
                                    onItemSelectedListener.onItemSelected(CustomSpinner1.this.view,view,i,l);
                                }
                            }
                        });

                        if (heiht == 0){
                            int hei = setListViewHeightBasedOnChildren(listView);
                            //这里设置下拉框的高度
                            if (hei >= 550){
                                pop = new PopupWindow(listView, ViewGroup.LayoutParams.MATCH_PARENT, 550, true);
                            }else{
                                pop = new PopupWindow(listView, ViewGroup.LayoutParams.MATCH_PARENT, hei, true);
                            }
                        }else{
                            pop = new PopupWindow(listView, ViewGroup.LayoutParams.MATCH_PARENT,heiht, true);
                        }
                        pop.setBackgroundDrawable(new ColorDrawable(0x00000000));
                        pop.setFocusable(true);
                        pop.setOnDismissListener(new PopupWindow.OnDismissListener() {
                            @Override
                            public void onDismiss() {
                                isPopShow = true;
                                ib.setImageResource(R.mipmap.xiala);
                                if (null != viewP){
                                    viewP.setAlpha(1);
                                    L.e("111111");
                                    viewP.setBackgroundColor(Color.rgb(255,255,255));
                                }
                            }
                        });
                        ib.setImageResource(R.mipmap.shangla);
                        pop.showAsDropDown(view,0, 0);
                        isPopShow = false;
                        if (null != viewP){
                            viewP.setAlpha(0.5f);
                            viewP.setBackgroundColor(Color.rgb(0,0,0));
                            L.e("00000000000");
                        }
                    }else{
                        if(isPopShow){
                            ib.setImageResource(R.mipmap.shangla);
                            pop.showAsDropDown(view, 0, 0);
                            if (null != viewP){
                                viewP.setAlpha(0.5f);
                                viewP.setBackgroundColor(Color.rgb(0,0,0));
                                L.e("00000000000");
                            }
                            isPopShow = false;
                        }else{
                            ib.setImageResource(R.mipmap.xiala);
                            pop.dismiss();
                            isPopShow = true;
                        }
                    }
                }
                onClickCustom();
            }
        });
        if (list == null || list.size() == 0){
            tv_name.setText("");
        }
        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 setBackGround(int back){
        view.setBackgroundResource(back);
    }

    public void setTextNameColor(int color){
        tv_name.setTextColor(color);
    }

    public void attachDataSource(List<String> list){
        this.list = list;
        if (isFirst && list != null && list.size() != 0){
            tv_name.setText(list.get(0));
            isFirst = false;
        }
    }
    public void setOnItemSelectedListener(OnItemSelectedListenerSpinner onItemSelectedListener){
       this.onItemSelectedListener = onItemSelectedListener;
    }
    public void setSpinnerHeiht(int heiht){
        this.heiht = heiht;
    }
    public void setNameText(String str){
        if (null != str){
            tv_name.setText(str);
        }
    }
    public void setSelectedIndex(int index){
        if (null != list && list.size() > 0){
            tv_name.setText(list.get(index));
            L.e("设置name");
            postion = index;
            mAdapter.notifyDataSetChanged();
        }
    }

    public String getNameText(){
        if (null != tv_name){
            return tv_name.getText().toString();
        }else{
            return "";
        }
    }

    public void setViewAlap(View view){
        this.viewP = view;
    }

    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.item1, null);
            final TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
            if (position == CustomSpinner1.this.postion){
                //选中条目的背景色
//                view.setBackgroundColor(Color.rgb(26,208,189));
                tv_name.setTextColor(Color.rgb(33,133,218));
            }
            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();
    }
}



3、资源下载在我上一篇博客,也可以下载我的资源直接 下载依赖库,添加依赖直接使用。