0%

控件

CompoundButton

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);//在布局文件中的Spinner控件
String[] local = getResources().getStringArray(R.array.mysp);//获取保存在XML文件中的数据(前边新建的XML文件)
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,local);//android.R.layout.simple_spinner_item,为系统的Spinner控件布局文件。local为我们的数据。适配器类将数据渲染到Spinner控件中
mysp.setAdapter(adapter);//将填充好数据的适配器类,加载到布局文件中的Spinner控件中,将数据显示在Activity上

如果是将数组数据渲染到系统自带的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;
}
...//省略一些getter、setter
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;//获取需要动态加载的资源ID
}

@NonNull
//每加载一个数据项,就调用一次这个getView方法
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//数据源:
//position,该数据项在数据源中的索引
//获取当前数据项实例(数据)
Fruit fruit = (Fruit)this.getItem(position);

//布局文件:
//动态加载子项模板(布局文件)。resourceid是在前边的FruitAdapter构造器中获取的。
View view = LayoutInflater.from(getContext()).inflate(this.resourceid,parent,false);
//获取子项模板(布局文件)中的控件实例
ImageView image = (ImageView)view.findViewById(R.id.fruitimg);//id为前边自定义列表中设置的控件id
TextView textView = (TextView)view.findViewById(R.id.fruitname);

//绑定(渲染)数据:
//布局文件中的控件,绑定数据(来自Fruit实例)
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 绑定 Adapter
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;
}
}

运行结果:

若图片不能正常显示,请在浏览器中打开

欢迎关注我的其它发布渠道