记录列表控件的使用。




Spinner

下拉列表

Spinner控件,下拉列表。

Spinner有两个属性1:prompt是初始的时候,Spinner显示的数据,是一个引用类型 2:entries是直接在xml布局文件中绑定数据源(可以不设置,即可以在Activity中动态绑定)

android ImageView数组 android控件数组_android

本地数据

新建xml文件,保存数组数据(数据源)。

android ImageView数组 android控件数组_android ImageView数组_02

添加数据

添加String-array标签,保存数据。

android ImageView数组 android控件数组_java_03

绑定数据

entries属性绑定

通过Spinner控件(下拉列表)的entries属性,将新建的xml文件中的数据(上边的数组)绑定到下拉列表中(Spinner)

android:entries="@array/在array文件中定义的数据名"(截图时项目不一样,所以图片里不是上边的mysp)

android ImageView数组 android控件数组_android studio_04

Adapter绑定

需要去掉entries属性。

装载数据使用到arrayadapter(数组适配器)。

数据源可以是XML文件或List集合。

XML文件

从XML文件中获取数据,再渲染到Spinner中。

android ImageView数组 android控件数组_android studio_05

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中。适配器类的用法是一样的,只是数据源不一样。

android ImageView数组 android控件数组_数据_06

响应Spinner选择事件

通过AdapterView.OnItemSelectedListener()的回调方法实现。(注意数据源local设置为全局变量)

android ImageView数组 android控件数组_java_07

监听器OnItemSelectedListener内,实参view为被选择的控件(Spinner中的子选项),i为数据源的下标。



ListView

ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。

案例

使用Adapter绑定数据,添加到ListView中。

准备

实体类

创建一个类Fruit(简单实体类),封装水果信息。包括水果图片、名字。

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类型)

android ImageView数组 android控件数组_android ImageView数组_08

自定义列表

创建一个布局(layout)xml文件。Fruit对象的信息渲染到该布局文件中,然后再加载到ListView中。

android ImageView数组 android控件数组_android_09

用于装载一个Fruit对象的数据。宽度占满屏幕,高度为120dp。ImageView控件放Fruit对象的图片,id为fruitimg。TextView控件放Fruit对象的文本,id为fruitname。

<?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>

android ImageView数组 android控件数组_数据_10

数据绑定

编写适配器类FruitAdapter,用于数据绑定。配合前边写的布局xml文件,实现Fruit对象的信息渲染到布局文件中。

Fruit对象中保存着一个个的水果信息,List集合中保存着很多Fruit对象。在使用时,将布局文件和保存Fruit对象的List集合作为实参传递给FruitAdapter。该FruitAdapter,把数据添加到布局文件中,产生一个个的view对象(填充了数据的layout布局文件)。

注意:ListView使用setAdapter(FruitAdapter对象)方法,添加view到页面中。

关于数据绑定,可以回看前边的Adapter绑定数据。

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的布局文件:

<?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到页面中。

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;
    }
}

运行结果:

android ImageView数组 android控件数组_android studio_11

android ImageView数组 android控件数组_android studio_12