继承关系
java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.AdapterView<T extends android.widget.Adapter>
android.widget.AbsSpinner
android.widget.Spinner
AdapterView的特征:只要为AdapterView提供Adapter即可。
静态添加项目
values文件夹下新建array.xml文件(也可以直接在stings.xml文件里插入节点)
string-array节点和item节点
<resources>
<string-array name="spinnerclass">
<item>C++</item>
<item>C#</item>
<item>java</item>
<item>python</item>
</string-array></resources>
layout布局文件里:
array资源文件里的spinnerclass类
'@array’表示array类型的节点,spinnerclass表示节点名字
android:entries="@array/spinnerclass"
databinding
不需要使用adapater来绑定视图和数据,用ObservableArrayList<T>来存储元素,增删操作只需要在ObservableArrayList中进行就可以。
<variable
name="item_list"
type="androidx.databinding.ObservableArrayList<String>" />
<Spinner
android:entries="@{item_list}" />
动态添加项目
//Cautions: has to use ArrayList as data source to perform add and remove operation
//数据源,ArrayList可以修改
String[] mitems = getResources().getStringArray(R.array.spinnerclass);
ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(mitems));
//adapter
//三个参数:context, item的布局文件, 数据源
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,
androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,
arrayList);
spinner.setAdapter(adapter);
增删元素可以通过adapter来操作(内部的ArrayList提供了增删的方法)
adapter.remove("C");
adapter.add("C++");
常用方法
String item_selected = spinner.getSelectedItem().toString();
String selectedItem = (String) parent.getItemAtPosition(position)
练习Demo
activity文件
package com.example.javalearningexamples.uiTest;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.example.javalearningexamples.R;
import java.util.ArrayList;
import java.util.Arrays;
public class SpinnerActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_spinner);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
Spinner spinner = findViewById(R.id.spinner);
String[] mitems = getResources().getStringArray(R.array.spinnerclass);
ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(mitems));
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this,
androidx.appcompat.R.layout.support_simple_spinner_dropdown_item,
arrayList);
spinner.setAdapter(adapter);
EditText editText = findViewById(R.id.editText_spinner_item);
Button button_delete = findViewById(R.id.button_delete);
Button button_insert = findViewById(R.id.button_insert);
button_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String item_selected = spinner.getSelectedItem().toString();
if(!item_selected.equals("")){
adapter.remove(item_selected);
}
}
});
button_insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String item = editText.getText().toString();
if(!item.equals("")){
adapter.add(item);
//notifyDataSetChanged();
}
}
});
}
}
布局文件
<?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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".uiTest.SpinnerActivity">
<Spinner android:id="@+id/spinner"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="324dp"
android:layout_marginEnd="40dp"
android:entries="@array/spinner"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button android:id="@+id/button_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="19dp"
android:layout_marginEnd="3dp"
android:text="Delete"
app:layout_constraintEnd_toEndOf="@+id/editText_spinner_item"
app:layout_constraintTop_toBottomOf="@+id/spinner" />
<EditText android:id="@+id/editText_spinner_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="6dp"
android:layout_marginEnd="7dp"
android:ems="10"
android:hint="addition item"
android:inputType="text"
app:layout_constraintEnd_toStartOf="@+id/button_insert"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/button_insert" />
<Button android:id="@+id/button_insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="31dp"
android:text="Insert"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/editText_spinner_item"
app:layout_constraintTop_toBottomOf="@+id/button_delete" />
</androidx.constraintlayout.widget.ConstraintLayout>
练习Demo data binding 方法
activity文件
package com.example.javalearningexamples.uiTest;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ObservableField;
import com.example.javalearningexamples.R;
import com.example.javalearningexamples.databinding.ActivitySpinnerDataBindingBinding;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class SpinnerDataBindingActivity extends AppCompatActivity {
ActivitySpinnerDataBindingBinding binding;
Spinner spinner;
ObservableArrayList<String> items;
ObservableField<String> text;
ObservableField<String> item_selected;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_spinner_data_binding);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
item_selected = new ObservableField<String>();
text = new ObservableField<String>();
items = new ObservableArrayList<String>();
MyClick myClick = new MyClick();
binding = DataBindingUtil.setContentView(this, R.layout.activity_spinner_data_binding);
items.addAll(Arrays.asList(getResources().getStringArray(R.array.spinnerclass)));
binding.setItemList(items);
binding.setText(text);
binding.setItemSelected(item_selected);
binding.setMyClick(myClick);
spinner = findViewById(R.id.spinner2);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String selectedItem = (String) parent.getItemAtPosition(position);
item_selected.set(selectedItem);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
public class MyClick{
public void insertClick(View view, String item){
if(!item.toString().equals(""))
items.add(item);
}
public void deleteClick(View view, String item){
//items.remove(item);
items.remove(item);
if(!items.isEmpty())
item_selected.set((String) spinner.getSelectedItem());
else
item_selected.set("");
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data> <variable name="item_list"
type="androidx.databinding.ObservableArrayList<String>" />
<variable name="myClick"
type="com.example.javalearningexamples.uiTest.SpinnerDataBindingActivity.MyClick" />
<variable name="text"
type="androidx.databinding.ObservableField<String>" />
<variable name="item_selected"
type="androidx.databinding.ObservableField<String>" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".uiTest.SpinnerDataBindingActivity">
<Spinner android:id="@+id/spinner2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="324dp"
android:layout_marginEnd="40dp"
android:entries="@{item_list}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button android:id="@+id/button_delete2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="19dp"
android:layout_marginEnd="3dp"
android:text="Delete"
android:onClick="@{(view) -> myClick.deleteClick(view, item_selected.toString())}"
app:layout_constraintEnd_toEndOf="@+id/editText_spinner_item2"
app:layout_constraintTop_toBottomOf="@+id/spinner2" />
<EditText android:id="@+id/editText_spinner_item2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="6dp"
android:inputType="text"
android:layout_marginEnd="7dp"
android:ems="10"
android:hint="addition item"
android:text="@={text}"
app:layout_constraintEnd_toStartOf="@+id/button_insert2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/button_insert2" />
<Button android:id="@+id/button_insert2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="31dp"
android:text="Insert"
android:onClick="@{(view) -> myClick.insertClick(view, text.toString())}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/editText_spinner_item2"
app:layout_constraintTop_toBottomOf="@+id/button_delete2" />
</androidx.constraintlayout.widget.ConstraintLayout></layout>