checkbox
switch开关
单选按钮
通过RadioGroup
分组实现互斥。(不能两个都选择)
Spinner-下拉列表
下拉列表
Spinner控件,下拉列表。
Spinner有两个属性1:prompt是初始的时候,Spinner显示的数据,是一个引用类型
2:entries是直接在xml布局文件中绑定数据源(可以不设置,即可以在Activity中动态绑定)
新建xml文件
新建xml文件,保存数组数据(数据源)。
添加数据
添加String-array
标签,保存数据。
绑定数据
entries属性绑定
通过Spinner控件(下拉列表)的entries属性,将新建的xml文件中的数据(上边的数组)绑定到下拉列表中(Spinner)
android:entries="@array/在array文件中定义的数据名"
(截图时项目不一样,所以图片里不是上边的mysp)
Adapter绑定
需要去掉entries属性。
装载数据使用到arrayadapter(数组适配器)。
数据源可以是XML文件或List集合。
XML文件
从XML文件中获取数据,再渲染到Spinner中。
1 2 3 4
Spinner mysp = (Spinner)findViewById(R.id.mysp); String[] local = getResources().getStringArray(R.array.mysp); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this ,android.R.layout.simple_spinner_item,local); mysp.setAdapter(adapter);
如果是将数组数据渲染到系统自带的layout文件(控件)中,使用ArrayAdapter类。若是自定义的layout文件,则需要自己编写适配器类(继承ArrayAdapter),完成数据渲染。见下边的ListView 。
List集合
从List集合中获取数据,再渲染到Spinner中。适配器类的用法是一样的,只是数据源不一样。
响应Spinner选择事件
通过AdapterView.OnItemSelectedListener()
的回调方法实现。(注意数据源local设置为全局变量)
监听器OnItemSelectedListener内,实参view为被选择的控件(Spinner中的子选项),i为数据源的下标。
ListView
ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
案例
使用Adapter绑定数据,添加到ListView中。
准备 实体类
创建一个类Fruit(简单实体类),封装水果信息。包括水果图片、名字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
package com.example.myapplication;public class Fruit { private int img; private String name; public Fruit (int img,String name) { this .img = img; this .name = name; } public int getImg () { return img; } ... public void setName (String name) { this .name = name; } }
图片资源:(Fruit类中,img的数据类型为int类型,就是因为图片放到了这里。使用时为R.drawable.pitaya
引用,在安卓中这个属于int类型)
自定义列表
创建一个布局(layout)xml文件。Fruit对象的信息渲染到该布局文件中,然后再加载到ListView中。
用于装载一个Fruit对象的数据。宽度占满屏幕,高度为120dp。ImageView控件放Fruit对象的图片,id为fruitimg。TextView控件放Fruit对象的文本,id为fruitname。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:layout_width ="match_parent" android:layout_height ="120dp" android:padding ="20dp" > <ImageView android:id ="@+id/fruitimg" android:layout_width ="80dp" android:layout_height ="80dp" > </ImageView > <TextView android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:id ="@+id/fruitname" android:hint ="水果" android:layout_centerVertical ="true" android:layout_toRightOf ="@+id/fruitimg" android:layout_marginLeft ="20dp" > </TextView > </RelativeLayout >
数据绑定
编写适配器类FruitAdapter,用于数据绑定。配合前边写的布局xml文件,实现Fruit对象的信息渲染到布局文件中。
Fruit对象中保存着一个个的水果信息,List集合中保存着很多Fruit对象。在使用时,将布局文件 和保存Fruit对象的List集合 作为实参 传递给FruitAdapter 。该FruitAdapter,把数据添加到布局文件中,产生一个个的view对象(填充了数据的layout布局文件)。
注意:ListView使用setAdapter(FruitAdapter对象)
方法,添加view到页面中。
关于数据绑定,可以回看前边的Adapter绑定数据 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
package com.example.myapplication;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.TextView;import androidx.annotation.NonNull;import androidx.annotation.Nullable;import java.util.List;public class FruitAdapter extends ArrayAdapter { int resourceid; public FruitAdapter (@NonNull Context context, int resource, @NonNull List objects) { super (context, resource, objects); resourceid = resource; } @NonNull @Override public View getView (int position, @Nullable View convertView, @NonNull ViewGroup parent) { Fruit fruit = (Fruit)this .getItem(position); View view = LayoutInflater.from(getContext()).inflate(this .resourceid,parent,false ); ImageView image = (ImageView)view.findViewById(R.id.fruitimg); TextView textView = (TextView)view.findViewById(R.id.fruitname); image.setImageResource(fruit.getImg()); textView.setText(fruit.getName()); return view; } }
在使用该适配器类时需要提供数据源(List集合)和自定义的布局文件。
使用
创建一个activity(页面),布局文件中添加一个ListView控件。
activity的布局文件:
1 2 3 4 5 6 7 8 9 10 11 12 13
<?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" tools:context =".activity_fruitlist" > <ListView android:id ="@+id/fruitlist" android:layout_width ="match_parent" android:layout_height ="match_parent" > </ListView > </androidx.constraintlayout.widget.ConstraintLayout >
activity的java代码:
ListView使用setAdapter(FruitAdapter对象)
方法,添加view到页面中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class activity_fruitlist extends AppCompatActivity { @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_fruitlist); List<Fruit> fruitList = this .GetData(); FruitAdapter adapter = new FruitAdapter(this ,R.layout.fruitlayout,fruitList); ListView listView = findViewById(R.id.fruitlist); listView.setAdapter(adapter); } private List<Fruit> GetData () { List<Fruit> fruitsList = new ArrayList<Fruit>(); Fruit fruit = new Fruit(R.drawable.apple,"爱波" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.pitaya,"火龙裹" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.banana,"布乃乃" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.grape,"菩陶" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.persimmon,"是紫" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.apple,"爱波" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.pitaya,"火龙裹" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.banana,"布乃乃" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.grape,"菩陶" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.persimmon,"是紫" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.apple,"爱波" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.pitaya,"火龙裹" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.banana,"布乃乃" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.grape,"菩陶" ); fruitsList.add(fruit); fruit = new Fruit(R.drawable.persimmon,"是紫" ); fruitsList.add(fruit); return fruitsList; } }
运行结果: