Java安卓开发 Spinner 快速教程 附Demo

继承关系

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&lt;String&gt;" />

<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&lt;String&gt;" />  
        <variable            name="myClick"  
            type="com.example.javalearningexamples.uiTest.SpinnerDataBindingActivity.MyClick" />  
        <variable            name="text"  
            type="androidx.databinding.ObservableField&lt;String&gt;" />  
        <variable            name="item_selected"  
            type="androidx.databinding.ObservableField&lt;String&gt;" />  
  
    </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>
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值