前言
实践是最好的学习方式,技术也如此。
一、简介
-
RecyclerView
是列表; - 好处:更高效率的列表控件;
- 用法:要点
RecycleerView.Adapter
的写法;可以经过LayoutManager
(布局管理器)来决定布局的款式,是线性的、网格列表仍是瀑布流列表; -
RecyclerView
列表是如何完成显现的 ?- 是将数据放到对应的方位上,根据数据内容的数量来显现(即告知列表有多少个条目) ;
二、Adapter
-
是什么
- 适配器、连接器;
-
为什么要有
Adapter
?- 列表中不只有一条数据,不像
TextView
、ImageView
一样,一个控件对应一条数据; - 列表方式的数据,如何将多个布局与多个数据连接起来?中间就经过
adapter
,将数据放到对应的控件的方位;
- 列表中不只有一条数据,不像
-
Adapter 的分类
-
ArrayAdapter
:简单列表; -
SimpleAdapter
:图文列表; -
BaseAdapter
:图文复杂列表 ;
-
三、示例
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); } }