package com.example.pickerviewlibrary.picker; import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.text.TextUtils; import android.util.DisplayMetrics; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; import com.example.pickerviewlibrary.R; import com.example.pickerviewlibrary.picker.adapter.DataAdapter; import com.example.pickerviewlibrary.picker.entity.AddressBean; import com.example.pickerviewlibrary.picker.entity.PickerData; import com.example.pickerviewlibrary.picker.listener.OnPickerClickListener; import com.example.pickerviewlibrary.picker.util.AddressSqLite_DB_Utile; import java.util.ArrayList; import java.util.List; public class TeaPickerView extends PopupWindow implements View.OnClickListener { private FrameLayout contentLayout; private RadioButton mTextFirst, mTextSecond, mTextThird, mTextFourth; private RadioGroup groupSelect; private View line; private ListView pickerList; private TextView pickerTitleName; private TextView pickerConfirm; private View view; private int index = 1; private List currData; private DataAdapter adapter; private Activity context; private OnPickerClickListener listener; private PickerData pickerData; private int height; private int radius = 0; private int backgroundColor = Color.parseColor("#ffffff"); public static int dataSize = 15; public static int dataColor; public static int dataHeight; private float alpha = 0.5f; public static boolean contentLine = false; public static Drawable contentLineDrawable; public static boolean scrollBal = false; public static boolean discolour = true; public static int discolourColor; public static boolean discolourHook = false; public static Drawable customHook; public TeaPickerView(Activity context) { super(context); this.context = context; // this.pickerData = pickerData; pickerData = new PickerData(); AddressBean addressBean = new AddressBean(); addressBean.setName("请选择地址"); pickerData.setInitSelectText(addressBean); initView(); } /** * 初始化地址数据 */ public void initAddressData() { List first = AddressSqLite_DB_Utile.getInit(context).addressDao().findByPcode("410000000000"); pickerData.setFirstDatas(first); } //显示具体的高度(dp),设置0是自适应 public TeaPickerView setHeights(int mHeight) { if (mHeight > 0) { height = getPixelsFromDp(mHeight); } return this; } //显示的高度占屏幕的百分比,高度没有默认值,需要主动设置 public TeaPickerView setScreenH(int num) { if (num > 0) { height = getScreenH(context) / num; } return this; } //设置整体的背景颜色 默认是#ffffff public TeaPickerView setBackground(int color) { backgroundColor = color; return this; } //设置圆角,默认0 public TeaPickerView setRadius(int mRadius) { this.radius = mRadius; return this; } //内容栏的背景颜色 默认是#ffffff public TeaPickerView setContentBackground(int color) { GradientDrawable drawable = new GradientDrawable(); //设置圆角大小 drawable.setCornerRadii(new float[]{radius, radius, radius, radius, 0, 0, 0, 0}); //设置shape背景色 drawable.setColor(color); contentLayout.setBackground(drawable); return this; } //内容栏的高度(dp) 默认是50dp public TeaPickerView setContentHeight(int mHeight) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) groupSelect.getLayoutParams(); params.height = getPixelsFromDp(mHeight); groupSelect.setLayoutParams(params); return this; } //内容栏字体的大小和颜色, 默认是16sp,#0aa666,此方法不会变换颜色 public TeaPickerView setContentText(int size, int color) { mTextFirst.setTextSize(size); mTextFirst.setTextColor(color); mTextSecond.setTextSize(size); mTextSecond.setTextColor(color); mTextThird.setTextSize(size); mTextThird.setTextColor(color); mTextFourth.setTextSize(size); mTextFourth.setTextColor(color); return this; } //自定义内容栏字体颜色变换器 在res目录下创建color文件夹用selector 默认颜色#555 选中颜色#0aa666 public TeaPickerView setContentText(ColorStateList colorStateList) { mTextFirst.setTextColor(colorStateList); mTextSecond.setTextColor(colorStateList); mTextThird.setTextColor(colorStateList); mTextFourth.setTextColor(colorStateList); return this; } //内容栏选中是否有下划线 默认不开启 public TeaPickerView setContentLine(boolean bl) { contentLine = bl; return this; } //自定义内容栏下划线用layer-list 默认是下边框描边 颜色#0fbc72 高度1dp public TeaPickerView setContentLineColor(Drawable drawable) { contentLineDrawable = drawable; return this; } //分割线的高度和颜色 默认是0.5dp #e5e5e5 public TeaPickerView setLine(int mHeight, int color) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) line.getLayoutParams(); params.height = getPixelsFromDp(mHeight); line.setLayoutParams(params); line.setBackgroundColor(color); return this; } //设置list的item的高度(dp) 默认是40dp public TeaPickerView setitemHeight(int mHeight) { dataHeight = getPixelsFromDp(mHeight); return this; } //设置list的字体大小和颜色 默认是15 #555 public TeaPickerView setListText(int size, int color) { dataSize = size; dataColor = color; return this; } //设置list是否显示滚动条,默认false public TeaPickerView setScrollBal(boolean bl) { scrollBal = bl; return this; } //设置阴影层的透明度 默认是0.5f public TeaPickerView setAlpha(float mFloat) { alpha = mFloat; return this; } //设置选中项是否加色,默认true public TeaPickerView setDiscolour(boolean bl) { discolour = bl; return this; } //设置选中项加色的颜色值,默认#0aa666 public TeaPickerView setDiscolourColor(int color) { discolourColor = color; return this; } //设置选中项是否有√图标,默认false public TeaPickerView setDiscolourHook(boolean bl) { discolourHook = bl; return this; } //自定义√图标 public TeaPickerView setCustomHook(Drawable drawable) { customHook = drawable; return this; } //参数设置完毕,一定要build一下 public void build() { initPicker(); initData(); } private GradientDrawable getSharp() { GradientDrawable drawable = new GradientDrawable(); //设置圆角大小 drawable.setCornerRadii(new float[]{radius, radius, radius, radius, 0, 0, 0, 0}); //设置shape背景色 drawable.setColor(backgroundColor); return drawable; } public void setOnPickerClickListener(OnPickerClickListener listener) { this.listener = listener; } private void initPicker() { this.setContentView(view); this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); if (height > 0) { this.setHeight(height); } this.setFocusable(true); this.setAnimationStyle(R.style.AnimBottom); this.setBackgroundDrawable(getSharp()); setOnDismissListener(new OnDismissListener() { @Override public void onDismiss() { WindowManager.LayoutParams lp = context.getWindow().getAttributes(); lp.alpha = 1f; context.getWindow().setAttributes(lp); } }); } private void initView() { //默认参数 dataColor = context.getResources().getColor(R.color.picker_text_color); dataHeight = getPixelsFromDp(40); discolourColor = context.getResources().getColor(R.color.picker_select_text_color); contentLineDrawable = context.getResources().getDrawable(R.drawable.tab_sharp); //加载view LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(R.layout.picker_view, null); contentLayout = view.findViewById(R.id.contentLayout); pickerTitleName = view.findViewById(R.id.pickerTitleName); pickerConfirm = view.findViewById(R.id.pickerConfirm); groupSelect = view.findViewById(R.id.groupSelect); mTextFirst = view.findViewById(R.id.mTextFirst); mTextSecond = view.findViewById(R.id.mTextSecond); mTextThird = view.findViewById(R.id.mTextThird); mTextFourth = view.findViewById(R.id.mTextFourth); line = view.findViewById(R.id.line); pickerList = view.findViewById(R.id.pickerList); mTextFirst.setOnClickListener(this); mTextSecond.setOnClickListener(this); mTextThird.setOnClickListener(this); pickerConfirm.setOnClickListener(this); if (!TextUtils.isEmpty(pickerData.getPickerTitleName())) { pickerTitleName.setText(pickerData.getPickerTitleName()); } } public void show(View view) { if (pickerData.getFirstDatas() != null) { WindowManager.LayoutParams lp = context.getWindow().getAttributes(); lp.alpha = alpha; context.getWindow().setAttributes(lp); showAtLocation(view, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); switch (index) { case 1: adapter.setList(currData, mTextFirst.getText().toString()); underlineState(); break; case 2: adapter.setList(currData, mTextSecond.getText().toString()); underlineState(); break; case 3: adapter.setList(currData, mTextThird.getText().toString()); underlineState(); break; case 4: adapter.setList(currData, mTextFourth.getText().toString()); underlineState(); break; } } else { Toast.makeText(context, "正在加载地址数据请稍后", Toast.LENGTH_SHORT).show(); } } private void initData() { currData = pickerData.getCurrDatas(index); adapter = new DataAdapter(context, currData); pickerList.setVerticalScrollBarEnabled(scrollBal); pickerList.setAdapter(adapter); if (pickerData.getFirstText() != null) { mTextFirst.setText(pickerData.getFirstText().getName()); if (pickerData.getSecondText() != null) { mTextSecond.setText(pickerData.getSecondText().getName()); if (pickerData.getThirdText() != null) { mTextThird.setText(pickerData.getThirdText().getName()); if (pickerData.getFourthText() != null) mTextFourth.setText(pickerData.getFourthText().getName()); } } mTextFirst.setChecked(true); } pickerList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { AddressBean currBean = currData.get(position); pickerData.clearSelectText(index); // mTextFirst.setText(pickerData.getFirstText().getName()); // mTextFirst.setTag(pickerData.getFirstText().getCode()); // mTextSecond.setText(pickerData.getSecondText().getName()); // mTextThird.setText(pickerData.getThirdText().getName()); List data = new ArrayList<>(); data = AddressSqLite_DB_Utile.getInit(context).addressDao().findByPcode(currBean.getCode()); if (index == 1) { pickerData.setFirstText(currBean); mTextFirst.setText(currBean.getName()); mTextFirst.setTag(currBean.getCode()); groupSelect.check(mTextFirst.getId()); pickerData.setSecondDatas(data); new UpdateData(currBean.getName(), data).invoke(); } else if (index == 2) { pickerData.setSecondText(currBean); mTextSecond.setText(currBean.getName()); mTextSecond.setTag(currBean.getCode()); groupSelect.check(mTextSecond.getId()); pickerData.setThirdDatas(data); new UpdateData(currBean.getName(), data).invoke(); } else if (index == 3) { pickerData.setThirdText(currBean); mTextThird.setText(currBean.getName()); mTextThird.setTag(currBean.getCode()); groupSelect.check(mTextThird.getId()); pickerData.setFourthDatas(data); new UpdateData(currBean.getName(), data).invoke(); } else if (index == 4) { pickerData.setFourthText(currBean); mTextFourth.setText(currBean.getName()); mTextFourth.setTag(currBean.getCode()); groupSelect.check(mTextFourth.getId()); if (listener != null) { listener.OnPickerClick(pickerData); } } } }); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.mTextFirst) { index = 1; currData = pickerData.getCurrDatas(index); adapter.setList(currData, mTextFirst.getText().toString()); underlineState(); } else if (id == R.id.mTextSecond) { index = 2; currData = pickerData.getCurrDatas(index); adapter.setList(currData, mTextSecond.getText().toString()); underlineState(); } else if (id == R.id.mTextThird) { index = 3; currData = pickerData.getCurrDatas(index); adapter.setList(currData, mTextThird.getText().toString()); underlineState(); } else if (id == R.id.mTextFourth) { index = 4; currData = pickerData.getCurrDatas(index); adapter.setList(currData, mTextFourth.getText().toString()); underlineState(); } /*else if (id == R.id.pickerConfirm) { if (listener != null) { dismiss(); listener.OnPickerConfirmClick(pickerData); } }*/ } private void underlineState() { if (!contentLine) { return; } switch (index) { case 1: mTextFirst.setBackground(contentLineDrawable); mTextSecond.setBackground(null); mTextThird.setBackground(null); mTextFourth.setBackground(null); break; case 2: mTextFirst.setBackground(null); mTextSecond.setBackground(contentLineDrawable); mTextThird.setBackground(null); mTextFourth.setBackground(null); break; case 3: mTextFirst.setBackground(null); mTextSecond.setBackground(null); mTextThird.setBackground(contentLineDrawable); mTextFourth.setBackground(null); break; case 4: mTextFirst.setBackground(null); mTextSecond.setBackground(null); mTextThird.setBackground(null); mTextFourth.setBackground(context.getResources().getDrawable(R.drawable.tab_sharp)); break; } } private class UpdateData { private String text; private List data; /** * @param text 地址码 */ UpdateData(String text, List data) { this.text = text; this.data = data; } void invoke() { if (!data.isEmpty()) { if (data != null && data.size() > 0) { currData = data; adapter.setList(currData, text); underlineState(); index++; } else { if (listener != null) { listener.OnPickerClick(pickerData); } } } else { if (listener != null) { listener.OnPickerClick(pickerData); } } } } public int getScreenW(Context aty) { DisplayMetrics dm = aty.getResources().getDisplayMetrics(); return dm.widthPixels; } public int getScreenH(Context aty) { DisplayMetrics dm = aty.getResources().getDisplayMetrics(); return dm.heightPixels; } private int getPixelsFromDp(int size) { DisplayMetrics metrics = new DisplayMetrics(); context.getWindowManager().getDefaultDisplay().getMetrics(metrics); return (size * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT; } }