• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

安卓基础学习 Day19|安卓高级控件------下拉列表

武飞扬头像
小鲁不吃猪蹄
帮助1

目录

下拉列表(spinner)

下拉列表(数组适配器、列表框形式)

1.提出要求

2.主布局资源文件

3.主界面 

4.条目布局文件

下拉列表(数组适配器、对话框形式) 

1.提出要求

2.主布局资源文件

3.条目布局文件

4.主界面

下拉列表(简单适配器) 

1.提出要求

2.条目布局

3.主布局资源文件

4.主界面

下拉列表(基本适配器)

1.提出要求

2.条目布局文件

3.主布局资源文件

4.适配器类 

5.实体类

6.主界面

复用 convertView进行优化


下拉列表(spinner)

Spinner用于从一串列表中选择某项,功能类似于单选按钮的组合

有两种展示的方式:列表框形式、对话框形式

下拉列表(数组适配器、列表框形式)

1.提出要求

学新通

2.主布局资源文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="match_parent"
  6.  
    android:orientation="vertical"
  7.  
    tools:context=".MainActivity">
  8.  
     
  9.  
    <TextView
  10.  
    android:layout_width="match_parent"
  11.  
    android:layout_height="wrap_content"
  12.  
    android:text="下拉模式的列表框"
  13.  
    android:textSize="17sp" />
  14.  
     
  15.  
    <Spinner
  16.  
    android:id="@ id/sp_dropdown"
  17.  
    android:layout_width="match_parent"
  18.  
    android:layout_height="wrap_content"
  19.  
    android:spinnerMode="dropdown"/>
  20.  
     
  21.  
    </LinearLayout>
学新通

效果

学新通

3.主界面 

声明变量

学新通

声明变量(静态数组,要展示的选项内容)

学新通

主界面完整代码

  1.  
    import androidx.appcompat.app.AppCompatActivity;
  2.  
     
  3.  
    import android.os.Bundle;
  4.  
    import android.view.View;
  5.  
    import android.widget.AdapterView;
  6.  
    import android.widget.ArrayAdapter;
  7.  
    import android.widget.Spinner;
  8.  
    import android.widget.Toast;
  9.  
     
  10.  
    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  11.  
    private Spinner sp_dropdown;
  12.  
     
  13.  
    //定义下拉列表需要显示的文本数组
  14.  
    private final static String[] starArray = {"水星", "金星", "地球", "火星", "木星", "土星", "天王星", "海王星"};
  15.  
     
  16.  
     
  17.  
    @Override
  18.  
    protected void onCreate(Bundle savedInstanceState) {
  19.  
    super.onCreate(savedInstanceState);
  20.  
    setContentView(R.layout.activity_main);
  21.  
    sp_dropdown = findViewById(R.id.sp_dropdown);
  22.  
    //声明一个下拉列表的数组适配器// 第一个参数:上下文,第二个参数:条目布局,第三个参数:要显示的数据
  23.  
    ArrayAdapter<String> startAdapter = new ArrayAdapter<>(this, R.layout.item_select, starArray);
  24.  
     
  25.  
    //将适配器给Spinner
  26.  
    sp_dropdown.setAdapter(startAdapter);
  27.  
     
  28.  
    //设置下拉框默认显示第一项
  29.  
    sp_dropdown.setSelection(0);
  30.  
     
  31.  
    //给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法
  32.  
    sp_dropdown.setOnItemSelectedListener(this);
  33.  
    }
  34.  
     
  35.  
    @Override
  36.  
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
  37.  
    Toast.makeText(MainActivity.this, "你选择的是" starArray[position], Toast.LENGTH_SHORT).show();
  38.  
    }
  39.  
     
  40.  
    @Override
  41.  
    public void onNothingSelected(AdapterView<?> adapterView) {
  42.  
     
  43.  
    }
  44.  
    }
学新通

新建条目布局(我这里根节点直接用的TestView)

学新通

学新通

4.条目布局文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="50dp"
  6.  
    android:gravity="center"
  7.  
    android:textColor="#0000ff"
  8.  
    android:textSize="17sp"
  9.  
    tools:text="火星" />

学新通

添加适配器(Adapter)

适配器作用:负责从数据集合中取出对应的数据显示到条目布局上

数组适配器(ArrayAdapter):最简单的适配器,只展示一行文字

实现步骤:

(1)编写列表项的XML文件,内部布局只要一个TextView标签

(2)调用ArrayAdapter的构造方法,填入待展现的字符串数组,以及列表项的XML文件(R。layout.item_select)

(3)调用下拉控件的setAdapter方法,传入第二步得到的适配器实例

声明数组适配器

学新通

 效果

学新通

 设置监听,一单选中弹出吐司

学新通

效果

学新通

下拉列表(数组适配器、对话框形式) 

1.提出要求

学新通

2.主布局资源文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="match_parent"
  6.  
    android:orientation="vertical"
  7.  
    tools:context=".MainActivity">
  8.  
     
  9.  
    <TextView
  10.  
    android:layout_width="match_parent"
  11.  
    android:layout_height="wrap_content"
  12.  
    android:text="下拉模式的列表框"
  13.  
    android:textSize="17sp" />
  14.  
     
  15.  
    <Spinner
  16.  
    android:id="@ id/sp_dialog"
  17.  
    android:layout_width="match_parent"
  18.  
    android:layout_height="wrap_content"
  19.  
    android:spinnerMode="dialog"/>
  20.  
     
  21.  
    </LinearLayout>
学新通

3.条目布局文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="50dp"
  6.  
    android:gravity="center"
  7.  
    android:textColor="#0000ff"
  8.  
    android:textSize="17sp"
  9.  
    tools:text="火星" />

4.主界面

  1.  
    package net.lzt.spinnerdialog;
  2.  
     
  3.  
    import androidx.appcompat.app.AppCompatActivity;
  4.  
     
  5.  
    import android.os.Bundle;
  6.  
    import android.view.View;
  7.  
    import android.widget.AdapterView;
  8.  
    import android.widget.ArrayAdapter;
  9.  
    import android.widget.Spinner;
  10.  
    import android.widget.Toast;
  11.  
     
  12.  
    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  13.  
    private Spinner sp_dialog;
  14.  
     
  15.  
    //定义下拉列表需要显示的文本数组
  16.  
    private final static String[] starArray = {"水星", "金星", "地球", "火星", "木星", "土星", "天王星", "海王星"};
  17.  
     
  18.  
     
  19.  
    @Override
  20.  
    protected void onCreate(Bundle savedInstanceState) {
  21.  
    super.onCreate(savedInstanceState);
  22.  
    setContentView(R.layout.activity_main);
  23.  
    sp_dialog = findViewById(R.id.sp_dialog);
  24.  
    //声明一个下拉列表的数组适配器// 第一个参数:上下文,第二个参数:条目布局,第三个参数:要显示的数据
  25.  
    ArrayAdapter<String> startAdapter = new ArrayAdapter<>(this, R.layout.item_select, starArray);
  26.  
     
  27.  
    //设置下拉框的标题。对话框模式才显示标题,下拉模式不显示标题
  28.  
    sp_dialog.setPrompt("请选择行星");
  29.  
     
  30.  
    //将适配器给Spinner
  31.  
    sp_dialog.setAdapter(startAdapter);
  32.  
     
  33.  
    //设置下拉框默认显示第一项
  34.  
    sp_dialog.setSelection(0);
  35.  
     
  36.  
    //给下拉框设置选择监听器,一旦用户选中某一项,就触发监听器的onItemSelected方法
  37.  
    sp_dialog.setOnItemSelectedListener(this);
  38.  
    }
  39.  
     
  40.  
    @Override
  41.  
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
  42.  
    Toast.makeText(MainActivity.this, "你选择的是" starArray[position], Toast.LENGTH_SHORT).show();
  43.  
    }
  44.  
     
  45.  
    @Override
  46.  
    public void onNothingSelected(AdapterView<?> adapterView) {
  47.  
     
  48.  
    }
  49.  
    }
学新通

两种方式的代码基本不变,但是对话框的可以显示一个标题学新通

效果

学新通

下拉列表(简单适配器) 

简单适配器(SimpleAdapter)

简单适配器允许在列表项中同时展示文本与图片

1.提出要求

学新通

2.条目布局

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    android:layout_width="match_parent"
  4.  
    android:layout_height="wrap_content"
  5.  
    android:orientation="horizontal">
  6.  
     
  7.  
    <ImageView
  8.  
    android:layout_width="0dp"
  9.  
    android:layout_height="50dp"
  10.  
    android:layout_weight="1"
  11.  
    android:src="@mipmap/diqiu" />
  12.  
     
  13.  
    <TextView
  14.  
    android:id="@ id/tv_name"
  15.  
    android:layout_width="0dp"
  16.  
    android:layout_height="match_parent"
  17.  
    android:layout_weight="3"
  18.  
    android:gravity="center"
  19.  
    android:textColor="#ff0000"
  20.  
    android:textSize="17sp"
  21.  
    android:text="地球"/>
  22.  
    </LinearLayout>
学新通

实现效果

学新通

3.主布局资源文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="match_parent"
  6.  
    android:orientation="vertical"
  7.  
    tools:context=".MainActivity">
  8.  
     
  9.  
    <TextView
  10.  
    android:layout_width="match_parent"
  11.  
    android:layout_height="wrap_content"
  12.  
    android:text="简单适配器"
  13.  
    android:textSize="17sp" />
  14.  
     
  15.  
    <Spinner
  16.  
    android:id="@ id/sp_icon"
  17.  
    android:layout_width="match_parent"
  18.  
    android:layout_height="wrap_content"
  19.  
    android:spinnerMode="dialog"/>
  20.  
     
  21.  
    </LinearLayout>
学新通

效果

学新通

4.主界面

  1.  
    import androidx.appcompat.app.AppCompatActivity;
  2.  
     
  3.  
    import android.os.Bundle;
  4.  
    import android.view.View;
  5.  
    import android.widget.AdapterView;
  6.  
    import android.widget.SimpleAdapter;
  7.  
    import android.widget.Spinner;
  8.  
    import android.widget.Toast;
  9.  
     
  10.  
    import java.util.ArrayList;
  11.  
    import java.util.HashMap;
  12.  
    import java.util.List;
  13.  
    import java.util.Map;
  14.  
     
  15.  
    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  16.  
     
  17.  
    //定义下拉列表需要显示的行星图标数组
  18.  
    private static final int[] iconArray = {
  19.  
    R.mipmap.shuixing, R.mipmap.jinxing, R.mipmap.diqiu, R.mipmap.huoxing,
  20.  
    R.mipmap.muxing, R.mipmap.tuxing, R.mipmap.tianwangxing, R.mipmap.haiwangxing
  21.  
    };
  22.  
    //定义下拉列表需要显示的行星名称数组
  23.  
    private static final String[] starArray = {"水星", "金星", "地球", "火星", "木星", "土星", "天王星", "海王星"};
  24.  
     
  25.  
    @Override
  26.  
    protected void onCreate(Bundle savedInstanceState) {
  27.  
    super.onCreate(savedInstanceState);
  28.  
    setContentView(R.layout.activity_main);
  29.  
     
  30.  
    //声明一个映射对象的列表,用于保存行星的图标与名称配对信息
  31.  
    List<Map<String, Object>> List = new ArrayList<>();
  32.  
    //iconArray是行星的图标数组,starArray是行星名称数组【这里遍历数组】
  33.  
    for (int i = 0; i < iconArray.length; i ) {
  34.  
    Map<String, Object> item = new HashMap<>();
  35.  
    item.put("icon", iconArray[i]);
  36.  
    item.put("name", starArray[i]);
  37.  
    List.add(item);
  38.  
    }
  39.  
     
  40.  
     
  41.  
    //建立绑定关系,声明一个下拉列表的简单适配器,其中指定了图标与文本两组数据
  42.  
    SimpleAdapter starAdapter = new SimpleAdapter(this, List,
  43.  
    R.layout.item_simple, //条目布局
  44.  
    new String[]{"icon", "name"}, //map中的key
  45.  
    new int[]{R.id.iv_icon, R.id.tv_name}); //map中的值
  46.  
     
  47.  
    Spinner sp_icon = findViewById(R.id.sp_icon);
  48.  
    sp_icon.setAdapter(starAdapter);
  49.  
    sp_icon.setSelection(0); // 默认选中0
  50.  
    sp_icon.setOnItemSelectedListener(this);
  51.  
     
  52.  
    }
  53.  
     
  54.  
    @Override
  55.  
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {
  56.  
    Toast.makeText(MainActivity.this, "你选择的是" starArray[position], Toast.LENGTH_SHORT).show();
  57.  
    }
  58.  
     
  59.  
    @Override
  60.  
    public void onNothingSelected(AdapterView<?> adapterView) {
  61.  
     
  62.  
    }
  63.  
    }
学新通

 集合当中数据与条目布局的对应关系 

学新通

 运行效果

学新通

 【我的图片是我网上找的然后截的图,大小有点差别,如果还想好看整齐点儿可以找大小一致的照片】

下拉列表(基本适配器)

基本适配器(BaseAdapter)是一种适应性更强的基本适配器

1.提出要求

2.条目布局文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    android:layout_width="match_parent"
  4.  
    android:layout_height="wrap_content"
  5.  
    android:orientation="horizontal">
  6.  
     
  7.  
    <!--这里用于显示行星图片的视图-->
  8.  
    <ImageView
  9.  
    android:id="@ id/iv_icon"
  10.  
    android:layout_width="0dp"
  11.  
    android:layout_height="80dp"
  12.  
    android:layout_weight="1"
  13.  
    android:scaleType="fitCenter"
  14.  
    android:src="@mipmap/diqiu" />
  15.  
     
  16.  
    <LinearLayout
  17.  
    android:layout_width="0dp"
  18.  
    android:layout_height="match_parent"
  19.  
    android:layout_marginLeft="5dp"
  20.  
    android:layout_weight="3"
  21.  
    android:orientation="vertical">
  22.  
     
  23.  
    <!--显示行星名称的文本视图-->
  24.  
    <TextView
  25.  
    android:id="@ id/tv_name"
  26.  
    android:layout_width="match_parent"
  27.  
    android:layout_height="0dp"
  28.  
    android:layout_weight="1"
  29.  
    android:gravity="start|center"
  30.  
    android:text="地球"
  31.  
    android:textColor="#000000"
  32.  
    android:textSize="20sp" />
  33.  
     
  34.  
    <TextView
  35.  
    android:id="@ id/tv_desc"
  36.  
    android:layout_width="match_parent"
  37.  
    android:layout_height="0dp"
  38.  
    android:layout_weight="2"
  39.  
    android:gravity="start|center"
  40.  
    android:text="地球是距太阳第三颗,也是太阳系第五大行星,地球是太阳系中密度最大的行星。"
  41.  
    android:textColor="#000000"
  42.  
    android:textSize="10sp" />
  43.  
    </LinearLayout>
  44.  
     
  45.  
     
  46.  
    </LinearLayout>
学新通

3.主布局资源文件

  1.  
    <?xml version="1.0" encoding="utf-8"?>
  2.  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.  
    xmlns:tools="http://schemas.android.com/tools"
  4.  
    android:layout_width="match_parent"
  5.  
    android:layout_height="match_parent"
  6.  
    android:orientation="vertical"
  7.  
    tools:context=".MainActivity">
  8.  
     
  9.  
    <TextView
  10.  
    android:layout_width="match_parent"
  11.  
    android:layout_height="wrap_content"
  12.  
    android:text="基本适配器"
  13.  
    android:textSize="17sp" />
  14.  
     
  15.  
    <Spinner
  16.  
    android:id="@ id/sp_planet"
  17.  
    android:layout_width="match_parent"
  18.  
    android:layout_height="wrap_content"
  19.  
    android:spinnerMode="dialog"/>
  20.  
     
  21.  
    </LinearLayout>
学新通

4.适配器类 

 BaseAdapter是一个抽象类,无法直接使用所以需要创建一个适配器类

  1.  
    import android.content.Context;
  2.  
    import android.view.LayoutInflater;
  3.  
    import android.view.View;
  4.  
    import android.view.ViewGroup;
  5.  
    import android.widget.BaseAdapter;
  6.  
    import android.widget.ImageView;
  7.  
    import android.widget.TextView;
  8.  
     
  9.  
    import java.util.List;
  10.  
     
  11.  
    //适配器
  12.  
     
  13.  
    public class PlanetBaseAdapter extends BaseAdapter {
  14.  
     
  15.  
    //定义成员属性
  16.  
    private Context mContext;
  17.  
    private List<Planet> mPlaneList; //行星信息的集合
  18.  
     
  19.  
     
  20.  
    public PlanetBaseAdapter(Context mContext, List<Planet> mPlaneList) {
  21.  
    this.mContext = mContext;
  22.  
    this.mPlaneList = mPlaneList;
  23.  
    }
  24.  
     
  25.  
    @Override
  26.  
    public int getCount() { //告诉适配器集合中有多少个元素
  27.  
    return mPlaneList.size();
  28.  
    }
  29.  
     
  30.  
    @Override
  31.  
    public Object getItem(int position) { //条目与数据对应的索引
  32.  
    return mPlaneList.get(position);
  33.  
    }
  34.  
     
  35.  
    @Override
  36.  
    public long getItemId(int position) { //Planet对应的id,但是这里没有,所以直接返回position(不会重复)
  37.  
    return position;
  38.  
    }
  39.  
     
  40.  
    @Override
  41.  
    public View getView(int position, View convertView, ViewGroup parent) { // 每个条目怎么来的
  42.  
    // 根据布局文件item_list.xml生成转换视图对象(导入条目布局)
  43.  
    View view = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
  44.  
    ImageView iv_icon = view.findViewById(R.id.iv_icon);
  45.  
    TextView tv_name = view.findViewById(R.id.tv_name);
  46.  
    TextView tv_desc = view.findViewById(R.id.tv_desc);
  47.  
     
  48.  
    // 给控件设置好数据(拿到数据)
  49.  
    Planet planet = mPlaneList.get(position);
  50.  
    iv_icon.setImageResource(planet.image);
  51.  
    tv_name.setText(planet.name);
  52.  
    tv_desc.setText(planet.desc);
  53.  
     
  54.  
    return view;
  55.  
    }
  56.  
    }
学新通

5.实体类

这里主要是存放行星的图片、名称以及介绍的信息,方便后续导入

这里关于各个行星的介绍网上复制即可,但是注意最好别太多

  1.  
    import java.util.ArrayList;
  2.  
    import java.util.List;
  3.  
     
  4.  
    //实体类
  5.  
     
  6.  
    public class Planet {
  7.  
    public int image; // 行星图标
  8.  
    public String name; //行星名称
  9.  
    public String desc; //行星描述
  10.  
     
  11.  
    public Planet(int image, String name, String desc) {
  12.  
    this.image = image;
  13.  
    this.name = name;
  14.  
    this.desc = desc;
  15.  
    }
  16.  
     
  17.  
    //定义下拉列表需要显示的行星图标数组
  18.  
    private static int[] iconArray = {R.mipmap.shuixing, R.mipmap.jinxing, R.mipmap.diqiu, R.mipmap.huoxing,
  19.  
    R.mipmap.muxing, R.mipmap.tuxing, R.mipmap.tianwangxing, R.mipmap.haiwangxing};
  20.  
     
  21.  
    //定义下拉列表需要显示的行星名称数组
  22.  
    private static final String[] nameArray = {"水星", "金星", "地球", "火星", "木星", "土星", "天王星", "海王星"};
  23.  
     
  24.  
    //定义下拉列表需要显示的行星描述数组
  25.  
    private static final String[] descArray = {
  26.  
    "水星最接近太阳 [3] ,是太阳系中体积和质量最小的行星。常和太阳同时出没,中国古代称之它为“辰星”。水星在直径上小于两个卫星——木卫三和土卫六。",
  27.  
    "太阳系中第六大行星,太阳系中温度最高的行星,中国古代称之为太白或太白金星。它有时是晨星,黎明出现于东方天空,被称为“启明”;有时又是昏星,黄昏后出现西方天空,被称为“长庚”。",
  28.  
    "地球是距太阳第三颗,也是太阳系第五大行星,地球是太阳系中密度最大的行星。地球,当然不需要飞行器即可被观测,然而我们直到二十世纪才有了整个行星的地图。",
  29.  
    "为距太阳第四远,也是太阳系中第七大行星,在中国古代又称荧火,因为火星呈红色,荧荧像火,亮度常有变化;而且在天空中运动,有时从西向东,有时又从东向西。",
  30.  
    "木星是离太阳第五颗行星,中国古代称为岁星,因为他公转一周正好是12年,也就是一地支,木星是太阳系行星中质量最大的一颗。",
  31.  
    "土星是离太阳第六远的行星,也是八大行星中第二大的行星,中国古代称为“镇星”,是太阳系密度最小的行星,可以浮在水上。",
  32.  
    "天王星是太阳系中离太阳第七远行星,也是太阳系中最冷的行星,从直径来看,是太阳系中第三大行星。天王星的体积比海王星大,质量却比其小。",
  33.  
    "海王星是环绕太阳运行的第八颗行星,也是太阳系中第四大天体(直径上)。海王星在直径上小于天王星,但质量比它大。"
  34.  
    };
  35.  
     
  36.  
    public static List<Planet> getDefaultList() {
  37.  
    List<Planet> planetList = new ArrayList<>();
  38.  
    for (int i = 0; i < iconArray.length; i ) {
  39.  
    planetList.add(new Planet(iconArray[i], nameArray[i], descArray[i]));//根据上面的三个数组构建的集合
  40.  
    }
  41.  
    return planetList;
  42.  
    }
  43.  
    }
学新通

6.主界面

  1.  
    import androidx.appcompat.app.AppCompatActivity;
  2.  
     
  3.  
    import android.os.Bundle;
  4.  
    import android.view.View;
  5.  
    import android.widget.AdapterView;
  6.  
    import android.widget.Spinner;
  7.  
    import android.widget.Toast;
  8.  
     
  9.  
    import java.util.List;
  10.  
     
  11.  
    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
  12.  
    private List<Planet> planetList;
  13.  
     
  14.  
    @Override
  15.  
    protected void onCreate(Bundle savedInstanceState) {
  16.  
    super.onCreate(savedInstanceState);
  17.  
    setContentView(R.layout.activity_main);
  18.  
     
  19.  
     
  20.  
    Spinner sp_planet = findViewById(R.id.sp_planet);
  21.  
     
  22.  
    //创建一个集合,获取默认的行星列表
  23.  
    planetList = Planet.getDefaultList();
  24.  
     
  25.  
    /**
  26.  
    * 指定Spinner的适配器
  27.  
    * BaseAdapter是一个抽象类,无法直接使用(创建一个适配器类)
  28.  
    * 构建一个行星适配器
  29.  
    */
  30.  
    PlanetBaseAdapter adapter = new PlanetBaseAdapter(this, planetList);
  31.  
    sp_planet.setAdapter(adapter);
  32.  
     
  33.  
    sp_planet.setSelection(0);
  34.  
    //选中的监听
  35.  
    sp_planet.setOnItemSelectedListener(this);
  36.  
    }
  37.  
     
  38.  
    @Override
  39.  
    public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
  40.  
     
  41.  
    Toast.makeText(MainActivity.this, "你选择的是" planetList.get(position).name, Toast.LENGTH_SHORT).show();
  42.  
    }
  43.  
     
  44.  
    @Override
  45.  
    public void onNothingSelected(AdapterView<?> adapterView) {
  46.  
     
  47.  
    }
  48.  
    }
学新通

条目与数据集合对应关系

学新通

 运行结果

学新通

复用 convertView进行优化

学新通 当列表的item从上方滚出屏幕视角之外时:

学新通

 优化后

学新通

  1.  
    @Override
  2.  
    public View getView(int position, View convertView, ViewGroup parent) { // 每个条目怎么来的
  3.  
    ViewHolder holder;
  4.  
    if (convertView == null) {
  5.  
    // 根据布局文件item_list.xml生成转换视图对象(导入条目布局)
  6.  
    convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list, null);
  7.  
    holder = new ViewHolder();
  8.  
    holder.iv_icon = convertView.findViewById(R.id.iv_icon);
  9.  
    holder.tv_name = convertView.findViewById(R.id.tv_name);
  10.  
    holder.tv_desc = convertView.findViewById(R.id.tv_desc);
  11.  
     
  12.  
    //将试图持有者保存到转换视图中(将holder绑定到convertView)
  13.  
    convertView.setTag(holder);
  14.  
    } else {
  15.  
    //重用上面的控件(将上面的控件打包好直接调用)
  16.  
    holder = (ViewHolder) convertView.getTag();
  17.  
    }
  18.  
     
  19.  
    // 给控件设置好数据(拿到数据)
  20.  
    Planet planet = mPlaneList.get(position);
  21.  
    holder.iv_icon.setImageResource(planet.image);
  22.  
    holder.tv_name.setText(planet.name);
  23.  
    holder.tv_desc.setText(planet.desc);
  24.  
     
  25.  
    return convertView;
  26.  
    }
  27.  
     
  28.  
    public final class ViewHolder {
  29.  
    public ImageView iv_icon;
  30.  
    public TextView tv_name;
  31.  
    public TextView tv_desc;
  32.  
    }
学新通

这里无论是if还是else都会刷新数据

这样个写法更企业化,也更节省空间。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbiejf
系列文章
更多 icon
同类精品
更多 icon
继续加载