效果图:
不显示重复项,下拉项不遮挡当前选中项,下拉时箭头方向改变
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
tools:context=".MainActivity">
<RelativeLayout
android:layout_width="120dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:padding="10dp">
<Spinner
android:id="@+id/sp"
android:overlapAnchor="false"
android:background="@drawable/spinner_raow_selector"
android:layout_width="120dp"
android:layout_height="wrap_content"
android:entries="@array/region_name"/>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
strings.xml
<resources>
<string name="app_name">My Application</string>
<string-array name="region_name">
<item>中国大陆</item>
<item>中国香港</item>
<item>中国澳门</item>
<item>中国台湾</item>
</string-array>
</resources>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Spinner sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sp=findViewById(R.id.sp);
final List<String> data=Arrays.asList(getResources().getStringArray(R.array.region_name));
// ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
//R.array.region_name, R.layout.item);
// adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//建立Adapter对象
//SpinnerAdapter adapter=new SpinnerAdapter(getApplicationContext(),data);
ArrayAdapter adapter0=new ArrayAdapter<String>(this,0,data){
public int i;
//当前选中项
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView= View.inflate(MainActivity.this, R.layout.spinner_item,null);
TextView tv=convertView.findViewById(R.id.tv);
tv.setText(data.get(position));
i=position;
return convertView;
}
//下拉项
@Override
public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
convertView= View.inflate(MainActivity.this,R.layout.spinner_item_drop,null);
TextView tv=convertView.findViewById(R.id.tv);
tv.setText(data.get(position));
//为了不重复显示子项,把高度设置为0
if(i==position){
LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,0);
tv.setLayoutParams(layoutParams);
}
return convertView;
}
};
sp.setAdapter(adapter0);
}
}
选中项布局
spinner_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:paddingStart="10dp"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="中国大陆"
android:textSize="14sp"
android:textColor="#FF65B4FE" />
</LinearLayout>
下拉项布局
spinner_item_drop_.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/spinner_drop_layer_list"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="10dp"
android:textColor="#FF666666"
android:textSize="14sp" />
</LinearLayout>
选中的项的布局变化,就是箭头的朝向的变化
spinner_raow-selector.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:background="@drawable/spinner_drop_layer_list"
android:gravity="center_vertical">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingStart="10dp"
android:textColor="#FF666666"
android:textSize="14sp" />
</LinearLayout>
下拉项的背景
spinner_drop_layer_list.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!--底层颜色为白色-->
<item>
<shape>
<corners android:radius="2dp" />
<solid android:color="@android:color/white" ></solid>
</shape>
</item>
<item android:top="1dp">
<shape>
<solid android:color="#FFF0F0F0" ></solid>
</shape>
</item>
</layer-list>