前言

实践是最好的学习方式,技术也如此。

一、简介

  • RecyclerView 是列表;
  • 好处:更高效率的列表控件;
  • 用法:要点 RecycleerView.Adapter 的写法;可以经过 LayoutManager(布局管理器)来决定布局的款式,是线性的、网格列表仍是瀑布流列表;
  • RecyclerView 列表是如何完成显现的 ?
    • 是将数据放到对应的方位上,根据数据内容的数量来显现(即告知列表有多少个条目) ;

二、Adapter

  • 是什么

    • 适配器、连接器;
  • 为什么要有 Adapter

    • 列表中不只有一条数据,不像 TextViewImageView 一样,一个控件对应一条数据;
    • 列表方式的数据,如何将多个布局与多个数据连接起来?中间就经过 adapter,将数据放到对应的控件的方位;
  • Adapter 的分类

    • ArrayAdapter:简单列表;
    • SimpleAdapter:图文列表;
    • BaseAdapter:图文复杂列表 ;

Android 车载使用开发——「RecyclerView」

三、示例

1、布景

用 RecyclerView 列表显现各个城市气候数据

2、代码

  • FutureWeatherAdapter 是一个自界说的适配器类,它承继自 RecyclerView.Adapter 类;在泛型参数中,指定了一个内部类 WeatherViewHolder 作为适配器的视图持有者

    • WeatherViewHolder 是用于在 RecyclerView 中显现每个气候数据的视图持有者类;
    • 通常情况下,你会在适配器内部界说一个承继自 RecyclerView.ViewHolder 的内部类来表明列表项的视图结构和布局
  • onCreateViewHolder() 办法用于创立 ViewHolder,即创立用于显现单个气候条目的视图,并回来 ViewHolder 目标;使用布局填充器从 XML 布局文件中实例化视图,并将其传递给自界说的 ViewHolder 目标。

    • 在创立新的 ViewHolder 实例时调用。当 RecyclerView 需求显现新的列表项时,会调用该办法来创立一个 ViewHolder 目标 ;
    • onCreateViewHolder() 回来的 ViewHolder 目标会被 RecyclerView 用于显现列表项。当 RecyclerView 需求显现新的列表项时,它会调用 onCreateViewHolder() 办法来创立一个新的 ViewHolder 目标,并将其回来
  • onBindViewHolder() 办法用于将数据绑定到 ViewHolder 上,即将详细的气候数据填充到对应的视图控件中。在这个办法中,获取当前方位的气候数据目标,然后将其特点分别设置到 ViewHolder 中的各个 TextView 和 ImageView 中;

    • 办法在 RecyclerView 需求将数据绑定到 ViewHolder 以显现新的列表项时被调用。当 RecyclerView 中的列表项需求更新或者需求显现新的列表项时,会调用该办法;
  • getItemCount() 办法用于获取数据会集的条目数,即气候数据列表的巨细;

    • getItemCount() 办法回来的数据会告知 RecyclerView 有多少个列表项需求在屏幕上显现。当 RecyclerView 需求确定列表的巨细时,它会调用 getItemCount() 办法
  • 内部类 WeatherViewHolder 承继自 RecyclerView.ViewHolder,用于持有每个气候条目的视图控件的引用;在构造办法中,经过传入的视图参数找到并引用了各个视图控件;

    
    public class FutureWeatherAdapter extends RecyclerView.Adapter<com.example.weatherapp.adapter.FutureWeatherAdapter.WeatherViewHolder> {
            private Context mContext;  // 上下文
            private List<DayWeatherBean> mWeatherBeans;  // 数据
            public FutureWeatherAdapter(Context mContext, List<DayWeatherBean> mWeatherBeans) {
                this.mContext = mContext;
                this.mWeatherBeans = mWeatherBeans;
            }
            // 先创立ViewHolder再将数据绑定
            @NonNull
        @Override
        public WeatherViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            // onCreateViewHolder()办法担任创立ViewHolder并将其回来给RecyclerView
            View view = LayoutInflater.from(mContext).inflate(R.layout.weather_item_layout, parent, false);  // 布局
            WeatherViewHolder weatherViewHolder = new WeatherViewHolder(view);
            return weatherViewHolder;
        }
        @Override
        public void onBindViewHolder(@NonNull WeatherViewHolder holder, int position) {
            // onBindViewHolder()办法担任将数据绑定到ViewHolder
            // holder: 表明要绑定的ViewHolder目标,position: 表明ViewHolder在RecyclerView中的方位
            // onBindViewHolder()办法担任将数据填充到ViewHolder的视图中
            // 它会被调用多次,每次RecyclerView需求显现一个新的ViewHolder时都会调用
            DayWeatherBean weatherBean = mWeatherBeans.get(position);  // 拿到当前方位的JavaBean目标
            holder.tvWeather.setText(weatherBean.getWea());
            holder.tvTem.setText(weatherBean.getTeamDay());
            holder.tvAir.setText(weatherBean.getWin_speed());
            holder.tvWin.setText(weatherBean.getWin());
            holder.tvTemLowHigh.setText(weatherBean.getTeamNight());
            holder.ivWeather.setImageResource(getImgResOfWeather(weatherBean.getWeaImg()));
        }
        // 总共有多少个条目
        @Override
        public int getItemCount() {
            return (mWeatherBeans == null) ? 0 : mWeatherBeans.size();
        }
        class WeatherViewHolder extends RecyclerView.ViewHolder {
            TextView tvWeather, tvTem, tvTemLowHigh, tvWin, tvAir;
            ImageView ivWeather;
            public WeatherViewHolder(@NonNull View itemView) {
                super(itemView);
                tvWeather = itemView.findViewById(R.id.tv_weather);
                tvAir = itemView.findViewById(R.id.air);
                tvTem = itemView.findViewById(R.id.tv_tem);
                tvTemLowHigh = itemView.findViewById(R.id.tv_tem_low_high);
                tvWin = itemView.findViewById(R.id.tv_win);
                ivWeather = itemView.findViewById(R.id.iv_weather);
            }
        }