一、效果如下
二、准备工作
1、3张图片
2、背景bg_spinner.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="1dp"
android:color="#3366CC"></stroke>
<corners android:radius="6dp"></corners>
</shape>
3、布局 layout_spinner_popwindow.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">
<ListView
android:id="@+id/spinner_pop_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#88000000"
android:divider="#00000000"
android:dividerHeight="0dp" />
</LinearLayout>
4、布局 item_spinner_pop.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="wrap_content"
android:background="#ffffff"
android:orientation="vertical">
<View
android:id="@+id/up_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#a9b7b7"
android:visibility="gone" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:background="#ffffff"
android:orientation="horizontal">
<TextView
android:id="@+id/type"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center|start"
android:text=""
android:textSize="15sp"
android:typeface="serif" />
<ImageView
android:id="@+id/isSelected"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_gravity="center"
android:layout_marginRight="10dp"
android:src="@mipmap/ic_gou"
android:visibility="gone" />
</LinearLayout>
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginStart="20dp"
android:layout_marginLeft="20dp"
android:background="#a9b7b7" />
</LinearLayout>
三、自定义代码
package com.android.sherry.androidtest.spinner;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
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.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import com.android.sherry.androidtest.R;
import java.util.List;
/*** 自定义Spinner下拉列表 ***/
@SuppressLint("AppCompatCustomView")
public class CustomSpinner extends TextView {
private Context mContext;
/*** 获取当前选中的item*/
private int selectedItemPosition = 0;
private List<String> mListData = null;
private PopupWindow mPopWindow = null;
private CustomSpinnerAdapter mCustomSpinnerAdapter = null;
private OnSpinnerItemClickListener mOnSpinnerItemClickListener = null;
public CustomSpinner(Context context) {
this(context, null);
}
public CustomSpinner(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
/**
* 初始化控件
*
* @param context
*/
private void initView(Context context) {
this.mContext = context;
Drawable drawable = getResources().getDrawable(R.mipmap.ic_spinner_down);
/// 这一步必须要做,否则不会显示.
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
setCompoundDrawables(null, null, drawable, null);
}
public void initData(List<String> listData) {
setData(listData);
setText(listData.get(selectedItemPosition));
View spinnerItemPopView = LayoutInflater.from(mContext).inflate(R.layout.layout_spinner_popwindow, null);
ListView listView = spinnerItemPopView.findViewById(R.id.spinner_pop_list);
mCustomSpinnerAdapter = new CustomSpinnerAdapter();
listView.setAdapter(mCustomSpinnerAdapter);
mPopWindow = new PopupWindow(spinnerItemPopView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
listView.setOnItemClickListener((parent, view, position, id) -> {
setText(mListData.get(position));
selectedItemPosition = position;
mCustomSpinnerAdapter.notifyDataSetChanged();
mPopWindow.dismiss();
if (mOnSpinnerItemClickListener != null) {
mOnSpinnerItemClickListener.OnSpinnerItemClick(parent, view, position, id);
}
});
mPopWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_transparent));
mPopWindow.setOnDismissListener(() -> {
Drawable drawable = getResources().getDrawable(R.mipmap.ic_spinner_down);
/// 这一步必须要做,否则不会显示.
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
setCompoundDrawables(null, null, drawable, null);
});
}
/**
* 设置数据
*
* @param list
*/
public void setData(List<String> list) {
if (null == list) {
return;
}
this.mListData = list;
}
/**
* 显示window
*/
void showSpinner() {
Drawable drawable = getResources().getDrawable(R.mipmap.ic_spinner_up);
/// 这一步必须要做,否则不会显示.
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
setCompoundDrawables(null, null, drawable, null);
mPopWindow.showAsDropDown(this);
}
/**
* 关闭当前的window
*/
void closeSpinner() {
if (mPopWindow != null && mPopWindow.isShowing()) {
mPopWindow.dismiss();
}
}
class CustomSpinnerAdapter extends BaseAdapter {
@Override
public int getCount() {
if (null == mListData) {
return 0;
}
return mListData.size();
}
@Override
public Object getItem(int position) {
return mListData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(mContext, R.layout.item_spinner_pop, null);
}
View divider = convertView.findViewById(R.id.divider);
View up_divider = convertView.findViewById(R.id.up_divider);
TextView textView = convertView.findViewById(R.id.type);
ImageView imageView = convertView.findViewById(R.id.isSelected);
if (position == 0) {
up_divider.setVisibility(View.VISIBLE);
} else {
up_divider.setVisibility(View.GONE);
}
if (position == mListData.size() - 1) {
divider.setVisibility(View.GONE);
} else {
divider.setVisibility(View.VISIBLE);
}
if (position == selectedItemPosition) {
imageView.setVisibility(View.VISIBLE);
textView.setTextColor(Color.parseColor("#99F47C30"));
} else {
imageView.setVisibility(View.GONE);
textView.setTextColor(Color.parseColor("#99000000"));
}
textView.setText(mListData.get(position));
return convertView;
}
}
/*** 设置item 点击事件**/
void setOnSpinnerItemClickListener(OnSpinnerItemClickListener listener) {
this.mOnSpinnerItemClickListener = listener;
}
interface OnSpinnerItemClickListener {
void OnSpinnerItemClick(AdapterView<?> parent, View view, int position, long id);
}
}
四、引用
1、在布局xml中,添加如下代码
<com.android.sherry.androidtest.spinner.CustomSpinner
android:id="@+id/customSpinner"
android:layout_width="match_parent"
android:layout_height="48dp"
android:paddingLeft="10dp"
android:paddingRight="8dp"
android:gravity="center_vertical"
android:layout_margin="10dp"
android:background="@drawable/bg_spinner" />
2、在activity中,添加如下代码:
public class SpinnerTestActivity extends AppCompatActivity {
private ArrayAdapter<String> arr_adapter;
private CustomSpinner customSpinner = null;
private List<String> mDataResouce = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spinner_test);
initDataResouce();
initCustomSpinner();
}
private void initDataResouce() {
mDataResouce = new ArrayList<>();
for (int i = 0; i < 20; i++) {
mDataResouce.add("苏A1234" + i);
}
}
private void initCustomSpinner() {
customSpinner = findViewById(R.id.customSpinner);
customSpinner.initData(mDataResouce);
customSpinner.setOnClickListener(v -> customSpinner.showSpinner());
}
}