Android学习笔记:RecyclerView

代码地址:
(1)基本用法:https://github.com/ambition-hb/RecyclerViewDemo
(2)横向滚动:https://github.com/ambition-hb/RecyclerViewDemo/tree/one
(3)瀑布流布局:https://github.com/ambition-hb/RecyclerViewDemo/tree/two
(4)点击事件:https://github.com/ambition-hb/RecyclerViewDemo/tree/three

上一节介绍了ListView,虽然其很强大,但是有一定的缺点。如果不使用一定的方法提升它的运行效率,ListView的性能将会非常差。此外,它的扩展性能也不好,因为LListView只能纵向滚动。

从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。不仅可以轻松实现和ListView同样的效果,还优化了ListView中存在的各种不足之处。

一、RecyclerView相关的类

类名 说明
RecyclerView.Adapter 托管数据集合,为每个Item创建视图
RecyclerView.ViewHolder 承载Item视图的子视图
RecyclerView.LayoutManager 负责Item视图的布局
RecyclerView.ItemDecoration 为每个Item视图添加子布局
RecyclerView.ItemAnimator 负责添加、删除数据时的动画效果

二、基本用法

在app/build.gradle文件的dependencies闭包中添加如下内容:

compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'

需要注意的是,RecyclerView版本需要与appcompat版本匹配,比如appcompat版本为26.+,那么RecyclerView版本也应为26.+,如下所示:

compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'

添加完成后点击同步,随后修改activity_main/xml布局文件,由于RecyclerView不是内置在系统SDK中的,需要将完整的包路径写出来,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

新建Weather类和其对应的布局文件weather_item.xml,如下所示:

package com.haobi.recyclerviewdemo;

public class Weather {
    private String name;
    private int imageId;

    public Weather(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImageId() {
        return imageId;
    }

    public void setImageId(int imageId) {
        this.imageId = imageId;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/weather_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/i_999_unknown"/>

    <TextView
        android:id="@+id/weather_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        android:text="未知天气"/>

</LinearLayout>

接下来为RecyclerView提供一个适配器,新建WeatherAdapter类,让这个适配器继承自RecyclerView.Adapter,并将泛型指定为FruitAdapter.ViewHolder(WeatherAdapter中的一个内部类),代码如下:

package com.haobi.recyclerviewdemo;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

/** * Created by 15739 on 2019/8/2. */

public class WeatherAdapter extends RecyclerView.Adapter<WeatherAdapter.ViewHolder> {

    private List<Weather> mWeatherList;

    //静态内部类:可以不依赖于外部类实例化而被实例化
    static class ViewHolder extends RecyclerView.ViewHolder{
        ImageView weatherImage;
        TextView weatherName;
        //静态内部类的构造函数
        public ViewHolder(View view){
            //传入的view就是RecyclerView子项的最外层布局
            super(view);
            //根据布局获取布局实例
            weatherImage = (ImageView) view.findViewById(R.id.weather_image);
            weatherName = (TextView) view.findViewById(R.id.weather_name);
        }
    }

    //构造函数
    public WeatherAdapter(List<Weather> weatherList){
        //把要展示的数据源传递进来,并赋给一个全局变量mWeatherList
        mWeatherList = weatherList;
    }

    //创建ViewHolder实例
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //加载weather_item布局
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.weather_item, parent, false);
        //创建ViewHolder实例,并将布局传入ViewHolder构造函数
        ViewHolder holder = new ViewHolder(view);
        //将ViewHolder实例返回
        return holder;
    }

    //对RecyclerView子项的数据进行赋值,会在每个子项滚动到屏幕内时执行
    @Override
    public void onBindViewHolder(WeatherAdapter.ViewHolder holder, int position) {
        //通过position参数得到当前Weather实例
        Weather weather = mWeatherList.get(position);
        //将数据设置到ViewHolder的ImageView和TextView中
        holder.weatherImage.setImageResource(weather.getImageId());
        holder.weatherName.setText(weather.getName());
    }

    //返回数据源长度
    @Override
    public int getItemCount() {
        //返回RecyclerView一共有多少个子项
        return mWeatherList.size();
    }
}

在上述代码中,首先定义了一个内部类ViewHolder,使其继承自RecyclerView.ViewHolder,并在其内部添加构造函数。然后在WeatherAdapter类中添加一个构造函数,将要展示的数据源传递进来,并赋给一个全局变量mWeatherList。由于WeatherAdapter是继承自RecyclerView.Adapter的,那么必须重写onCreateViewHolder()、onBindViewHolder()、getItemCount()三个方法。

最后,修改MainActivity中的代码,如下所示:

package com.haobi.recyclerviewdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<Weather> weatherList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWeather();//初始化天气数据
        //获取RecyclerView实例
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        //创建LinearLayoutManager对象
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //将LinearLayoutManager对象设置到RecyclerView当中
        recyclerView.setLayoutManager(layoutManager);
        //创建WeatherAdapter实例并将天气数据传入WeatherAdapter的构造函数中
        WeatherAdapter adapter = new WeatherAdapter(weatherList);
        //调用RecyclerView的setAdapter()方法来设置适配器
        recyclerView.setAdapter(adapter);
    }

    private void initWeather(){
        Weather i_100 = new Weather("Sunny", R.drawable.i_100_sunny);
        weatherList.add(i_100);
        Weather i_101 = new Weather("Cloudy", R.drawable.i_101_cloudy);
        weatherList.add(i_101);
        Weather i_102 = new Weather("Few Clouds", R.drawable.i_102_few_clouds);
        weatherList.add(i_102);
        Weather i_103 = new Weather("Partly Cloudy", R.drawable.i_103_partly_cloudy);
        weatherList.add(i_103);
        Weather i_104 = new Weather("Overcast", R.drawable.i_104_overcast);
        weatherList.add(i_104);
        Weather i_200 = new Weather("Windy", R.drawable.i_200_windy);
        weatherList.add(i_200);
        Weather i_201 = new Weather("Calm", R.drawable.i_201_calm);
        weatherList.add(i_201);
        Weather i_202 = new Weather("Light Breeze", R.drawable.i_202_light_breeze);
        weatherList.add(i_202);
        Weather i_203 = new Weather("Moderate", R.drawable.i_203_moderate);
        weatherList.add(i_203);
        Weather i_204 = new Weather("Fresh Breeze", R.drawable.i_204_fresh_breeze);
        weatherList.add(i_204);
        Weather i_205 = new Weather("Strong Breeze", R.drawable.i_205_strong_breeze);
        weatherList.add(i_205);
        Weather i_206 = new Weather("High Wind", R.drawable.i_206_high_wind);
        weatherList.add(i_206);
        Weather i_207 = new Weather("Gale", R.drawable.i_207_gale);
        weatherList.add(i_207);
        Weather i_208 = new Weather("Strong Gale", R.drawable.i_208_strong_gale);
        weatherList.add(i_208);
        Weather i_209 = new Weather("Storm", R.drawable.i_209_storm);
        weatherList.add(i_209);
        Weather i_210 = new Weather("Violent Storm", R.drawable.i_210_violent_storm);
        weatherList.add(i_210);
        Weather i_211 = new Weather("Hurricane", R.drawable.i_211_hurricane);
        weatherList.add(i_211);
        Weather i_212 = new Weather("Tornado", R.drawable.i_212_tornado);
        weatherList.add(i_212);
        Weather i_213 = new Weather("Tropical Storm", R.drawable.i_213_tropical_storm);
        weatherList.add(i_213);
        Weather i_300 = new Weather("Shower Rain", R.drawable.i_300_shower_rain);
        weatherList.add(i_300);
        Weather i_301 = new Weather("Heavy Shower Rain", R.drawable.i_301_heavy_shower_rain);
        weatherList.add(i_301);
        Weather i_302 = new Weather("Thundershower", R.drawable.i_302_thundershower);
        weatherList.add(i_302);
        Weather i_303 = new Weather("Heavy Thunderstorm", R.drawable.i_303_heavy_thunderstorm);
        weatherList.add(i_303);
        Weather i_304 = new Weather("Thundershower with hail", R.drawable.i_304_thundershower_with_hail);
        weatherList.add(i_304);
        Weather i_305 = new Weather("Light Rain", R.drawable.i_305_light_rain);
        weatherList.add(i_305);
        Weather i_306 = new Weather("Moderate Rain", R.drawable.i_306_moderate_rain);
        weatherList.add(i_306);
        Weather i_307 = new Weather("Heavy Rain", R.drawable.i_307_heavy_rain);
        weatherList.add(i_307);
        Weather i_308 = new Weather("Extreme Rain", R.drawable.i_308_extreme_rain);
        weatherList.add(i_308);
        Weather i_309 = new Weather("Drizzle Rain", R.drawable.i_309_drizzle_rain);
        weatherList.add(i_309);
        Weather i_310 = new Weather("Storm", R.drawable.i_310_storm);
        weatherList.add(i_310);
        Weather i_311 = new Weather("Heavy Storm", R.drawable.i_311_heavy_storm);
        weatherList.add(i_311);
        Weather i_312 = new Weather("Severe Storm", R.drawable.i_312_severe_storm);
        weatherList.add(i_312);
        Weather i_313 = new Weather("Freezing Rain", R.drawable.i_313_freezing_rain);
        weatherList.add(i_313);
        Weather i_314 = new Weather("Light to moderate rain", R.drawable.i_314_light_to_moderate_rain);
        weatherList.add(i_314);
        Weather i_315 = new Weather("Moderate to heavy rain", R.drawable.i_315_moderate_to_heavy_rain);
        weatherList.add(i_315);
        Weather i_316 = new Weather("Heavy rain to storm", R.drawable.i_316_heavy_rain_to_storm);
        weatherList.add(i_316);
        Weather i_317 = new Weather("Storm to heavy storm", R.drawable.i_317_storm_to_heavy_storm);
        weatherList.add(i_317);
        Weather i_318 = new Weather("Heavy to severe storm", R.drawable.i_318_heavy_to_server_storm);
        weatherList.add(i_318);
        Weather i_399 = new Weather("Rain", R.drawable.i_399_rain);
        weatherList.add(i_399);
        Weather i_400 = new Weather("Light Snow", R.drawable.i_400_light_snow);
        weatherList.add(i_400);
        Weather i_401 = new Weather("Moderate Snow", R.drawable.i_401_moderate_snow);
        weatherList.add(i_401);
        Weather i_402 = new Weather("Heavy Snow", R.drawable.i_402_heavy_snow);
        weatherList.add(i_402);
        Weather i_403 = new Weather("Snowstorm", R.drawable.i_403_snowstorm);
        weatherList.add(i_403);
        Weather i_404 = new Weather("Sleet", R.drawable.i_404_sleet);
        weatherList.add(i_404);
        Weather i_405 = new Weather("Rain And Snow", R.drawable.i_405_rain_and_snow);
        weatherList.add(i_405);
        Weather i_406 = new Weather("Shower Snow", R.drawable.i_406_shower_snow);
        weatherList.add(i_406);
        Weather i_407 = new Weather("Snow Flurry", R.drawable.i_407_snow_flurry);
        weatherList.add(i_407);
        Weather i_408 = new Weather("Light to moderate snow", R.drawable.i_408_light_to_moderate_snow);
        weatherList.add(i_408);
        Weather i_409 = new Weather("Moderate to heavy snow", R.drawable.i_409_moderate_to_heavy_snow);
        weatherList.add(i_409);
        Weather i_410 = new Weather("Heavy snow to snowstorm", R.drawable.i_410_heavy_snow_to_snowstorm);
        weatherList.add(i_410);
        Weather i_499 = new Weather("Snow", R.drawable.i_499_snow);
        weatherList.add(i_499);
        Weather i_500 = new Weather("Mist", R.drawable.i_500_mist);
        weatherList.add(i_500);
        Weather i_501 = new Weather("Foggy", R.drawable.i_501_foggy);
        weatherList.add(i_501);
        Weather i_502 = new Weather("Haze", R.drawable.i_502_haze);
        weatherList.add(i_502);
        Weather i_503 = new Weather("Sand", R.drawable.i_503_sand);
        weatherList.add(i_503);
        Weather i_504 = new Weather("Dust", R.drawable.i_504_dust);
        weatherList.add(i_504);
        Weather i_507 = new Weather("Duststorm", R.drawable.i_507_duststorm);
        weatherList.add(i_507);
        Weather i_508 = new Weather("Sandstorm", R.drawable.i_508_sandstorm);
        weatherList.add(i_508);
        Weather i_509 = new Weather("Dense fog", R.drawable.i_509_dense_fog);
        weatherList.add(i_509);
        Weather i_510 = new Weather("Strong fog", R.drawable.i_510_strong_fog);
        weatherList.add(i_510);
        Weather i_511 = new Weather("Moderate haze", R.drawable.i_511_moderate_haze);
        weatherList.add(i_511);
        Weather i_512 = new Weather("Heavy haze", R.drawable.i_512_heavy_haze);
        weatherList.add(i_512);
        Weather i_513 = new Weather("Severe haze", R.drawable.i_513_severe_haze);
        weatherList.add(i_513);
        Weather i_514 = new Weather("Heavy fog", R.drawable.i_514_heavy_fog);
        weatherList.add(i_514);
        Weather i_515 = new Weather("Extra heavy fog", R.drawable.i_515_extra_heavy_fog);
        weatherList.add(i_515);
        Weather i_900 = new Weather("Hot", R.drawable.i_900_hot);
        weatherList.add(i_900);
        Weather i_901 = new Weather("Cold", R.drawable.i_901_cold);
        weatherList.add(i_901);
        Weather i_999 = new Weather("Unknown", R.drawable.i_999_unknown);
        weatherList.add(i_999);
    }
}

至此,RecyclerView实现类与ListView一模一样的效果,效果如下图所示:
Android学习笔记:RecyclerView_第1张图片

三、横向滚动

RecyclerView除了能够实现ListView的纵向滚动效果,还可以实现横向滚动效果。
首先,修改weather_item.xml布局文件,将其中的元素改为垂直排列,并将宽度指定为固定值,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/weather_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/i_999_unknown"
        android:layout_gravity="center_horizontal"/>

    <TextView
        android:id="@+id/weather_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="未知天气"
        android:layout_marginTop="10dp"/>

</LinearLayout>

接下来,修改MainActivity中的代码,只需要添加一行代码,调用LinearLayoutManager的setOrientation()方法来设置布局的排列方向,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ......
    //创建LinearLayoutManager对象
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    //调用LinearLayoutManager的setOrientation()方法来设置布局的排列方向
    //默认是纵向排列
    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    //将LinearLayoutManager对象设置到RecyclerView当中
    recyclerView.setLayoutManager(layoutManager);
    ......
}

效果图如下所示:
Android学习笔记:RecyclerView_第2张图片

四、瀑布流布局

除了LinearLayoutManager之外,RecyclerView还提供了GridLayoutManager和StaggeredGridLayoutManager这两种内置的布局排列方式。GridLayoutManager可以实现网格布局,StaggeredGridLayoutManager可以实现瀑布流布局。
首先,修改weather_item.xml布局文件。如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5dp">

    <ImageView
        android:id="@+id/weather_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/i_999_unknown"
        android:layout_gravity="center_horizontal"/>

    <TextView
        android:id="@+id/weather_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:text="未知天气"
        android:layout_marginTop="10dp"/>

</LinearLayout>

然后,修改MainActivity,创建一个StaggeredGridLayoutManager实例,接收两个参数,第一个参数用于指定布局的列数,传入3即表示会把布局分为三列;第二个参数用于指定布局的排列方向,传入StaggeredGridLayoutManager.VERTICAL表示会让布局纵向排列。代码如下所示:

package com.haobi.recyclerviewdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private List<Weather> weatherList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initWeather();//初始化天气数据
        //获取RecyclerView实例
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        //创建StaggeredGridLayoutManager实例
        StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
        //将LinearLayoutManager对象设置到RecyclerView当中
        recyclerView.setLayoutManager(layoutManager);
        //创建WeatherAdapter实例并将天气数据传入WeatherAdapter的构造函数中
        WeatherAdapter adapter = new WeatherAdapter(weatherList);
        //调用RecyclerView的setAdapter()方法来设置适配器
        recyclerView.setAdapter(adapter);
    }

    private void initWeather(){
        Weather i_100 = new Weather("Sunny", R.drawable.i_100_sunny);
        weatherList.add(i_100);
        Weather i_101 = new Weather("Cloudy", R.drawable.i_101_cloudy);
        weatherList.add(i_101);
        Weather i_102 = new Weather("Few Clouds", R.drawable.i_102_few_clouds);
        weatherList.add(i_102);
        Weather i_103 = new Weather("Partly Cloudy", R.drawable.i_103_partly_cloudy);
        weatherList.add(i_103);
        Weather i_104 = new Weather("Overcast", R.drawable.i_104_overcast);
        weatherList.add(i_104);
        Weather i_200 = new Weather("Windy", R.drawable.i_200_windy);
        weatherList.add(i_200);
        Weather i_201 = new Weather("Calm", R.drawable.i_201_calm);
        weatherList.add(i_201);
        Weather i_202 = new Weather("Light Breeze", R.drawable.i_202_light_breeze);
        weatherList.add(i_202);
        Weather i_203 = new Weather("Moderate", R.drawable.i_203_moderate);
        weatherList.add(i_203);
        Weather i_204 = new Weather("Fresh Breeze", R.drawable.i_204_fresh_breeze);
        weatherList.add(i_204);
        Weather i_205 = new Weather("Strong Breeze", R.drawable.i_205_strong_breeze);
        weatherList.add(i_205);
        Weather i_206 = new Weather("High Wind", R.drawable.i_206_high_wind);
        weatherList.add(i_206);
        Weather i_207 = new Weather("Gale", R.drawable.i_207_gale);
        weatherList.add(i_207);
        Weather i_208 = new Weather("Strong Gale", R.drawable.i_208_strong_gale);
        weatherList.add(i_208);
        Weather i_209 = new Weather("Storm", R.drawable.i_209_storm);
        weatherList.add(i_209);
        Weather i_210 = new Weather("Violent Storm", R.drawable.i_210_violent_storm);
        weatherList.add(i_210);
        Weather i_211 = new Weather("Hurricane", R.drawable.i_211_hurricane);
        weatherList.add(i_211);
        Weather i_212 = new Weather("Tornado", R.drawable.i_212_tornado);
        weatherList.add(i_212);
        Weather i_213 = new Weather("Tropical Storm", R.drawable.i_213_tropical_storm);
        weatherList.add(i_213);
        Weather i_300 = new Weather("Shower Rain", R.drawable.i_300_shower_rain);
        weatherList.add(i_300);
        Weather i_301 = new Weather("Heavy Shower Rain", R.drawable.i_301_heavy_shower_rain);
        weatherList.add(i_301);
        Weather i_302 = new Weather("Thundershower", R.drawable.i_302_thundershower);
        weatherList.add(i_302);
        Weather i_303 = new Weather("Heavy Thunderstorm", R.drawable.i_303_heavy_thunderstorm);
        weatherList.add(i_303);
        Weather i_304 = new Weather("Thundershower with hail", R.drawable.i_304_thundershower_with_hail);
        weatherList.add(i_304);
        Weather i_305 = new Weather("Light Rain", R.drawable.i_305_light_rain);
        weatherList.add(i_305);
        Weather i_306 = new Weather("Moderate Rain", R.drawable.i_306_moderate_rain);
        weatherList.add(i_306);
        Weather i_307 = new Weather("Heavy Rain", R.drawable.i_307_heavy_rain);
        weatherList.add(i_307);
        Weather i_308 = new Weather("Extreme Rain", R.drawable.i_308_extreme_rain);
        weatherList.add(i_308);
        Weather i_309 = new Weather("Drizzle Rain", R.drawable.i_309_drizzle_rain);
        weatherList.add(i_309);
        Weather i_310 = new Weather("Storm", R.drawable.i_310_storm);
        weatherList.add(i_310);
        Weather i_311 = new Weather("Heavy Storm", R.drawable.i_311_heavy_storm);
        weatherList.add(i_311);
        Weather i_312 = new Weather("Severe Storm", R.drawable.i_312_severe_storm);
        weatherList.add(i_312);
        Weather i_313 = new Weather("Freezing Rain", R.drawable.i_313_freezing_rain);
        weatherList.add(i_313);
        Weather i_314 = new Weather("Light to moderate rain", R.drawable.i_314_light_to_moderate_rain);
        weatherList.add(i_314);
        Weather i_315 = new Weather("Moderate to heavy rain", R.drawable.i_315_moderate_to_heavy_rain);
        weatherList.add(i_315);
        Weather i_316 = new Weather("Heavy rain to storm", R.drawable.i_316_heavy_rain_to_storm);
        weatherList.add(i_316);
        Weather i_317 = new Weather("Storm to heavy storm", R.drawable.i_317_storm_to_heavy_storm);
        weatherList.add(i_317);
        Weather i_318 = new Weather("Heavy to severe storm", R.drawable.i_318_heavy_to_server_storm);
        weatherList.add(i_318);
        Weather i_399 = new Weather("Rain", R.drawable.i_399_rain);
        weatherList.add(i_399);
        Weather i_400 = new Weather("Light Snow", R.drawable.i_400_light_snow);
        weatherList.add(i_400);
        Weather i_401 = new Weather("Moderate Snow", R.drawable.i_401_moderate_snow);
        weatherList.add(i_401);
        Weather i_402 = new Weather("Heavy Snow", R.drawable.i_402_heavy_snow);
        weatherList.add(i_402);
        Weather i_403 = new Weather("Snowstorm", R.drawable.i_403_snowstorm);
        weatherList.add(i_403);
        Weather i_404 = new Weather("Sleet", R.drawable.i_404_sleet);
        weatherList.add(i_404);
        Weather i_405 = new Weather("Rain And Snow", R.drawable.i_405_rain_and_snow);
        weatherList.add(i_405);
        Weather i_406 = new Weather("Shower Snow", R.drawable.i_406_shower_snow);
        weatherList.add(i_406);
        Weather i_407 = new Weather("Snow Flurry", R.drawable.i_407_snow_flurry);
        weatherList.add(i_407);
        Weather i_408 = new Weather("Light to moderate snow", R.drawable.i_408_light_to_moderate_snow);
        weatherList.add(i_408);
        Weather i_409 = new Weather("Moderate to heavy snow", R.drawable.i_409_moderate_to_heavy_snow);
        weatherList.add(i_409);
        Weather i_410 = new Weather("Heavy snow to snowstorm", R.drawable.i_410_heavy_snow_to_snowstorm);
        weatherList.add(i_410);
        Weather i_499 = new Weather("Snow", R.drawable.i_499_snow);
        weatherList.add(i_499);
        Weather i_500 = new Weather("Mist", R.drawable.i_500_mist);
        weatherList.add(i_500);
        Weather i_501 = new Weather("Foggy", R.drawable.i_501_foggy);
        weatherList.add(i_501);
        Weather i_502 = new Weather("Haze", R.drawable.i_502_haze);
        weatherList.add(i_502);
        Weather i_503 = new Weather("Sand", R.drawable.i_503_sand);
        weatherList.add(i_503);
        Weather i_504 = new Weather("Dust", R.drawable.i_504_dust);
        weatherList.add(i_504);
        Weather i_507 = new Weather("Duststorm", R.drawable.i_507_duststorm);
        weatherList.add(i_507);
        Weather i_508 = new Weather("Sandstorm", R.drawable.i_508_sandstorm);
        weatherList.add(i_508);
        Weather i_509 = new Weather("Dense fog", R.drawable.i_509_dense_fog);
        weatherList.add(i_509);
        Weather i_510 = new Weather("Strong fog", R.drawable.i_510_strong_fog);
        weatherList.add(i_510);
        Weather i_511 = new Weather("Moderate haze", R.drawable.i_511_moderate_haze);
        weatherList.add(i_511);
        Weather i_512 = new Weather("Heavy haze", R.drawable.i_512_heavy_haze);
        weatherList.add(i_512);
        Weather i_513 = new Weather("Severe haze", R.drawable.i_513_severe_haze);
        weatherList.add(i_513);
        Weather i_514 = new Weather("Heavy fog", R.drawable.i_514_heavy_fog);
        weatherList.add(i_514);
        Weather i_515 = new Weather("Extra heavy fog", R.drawable.i_515_extra_heavy_fog);
        weatherList.add(i_515);
        Weather i_900 = new Weather("Hot", R.drawable.i_900_hot);
        weatherList.add(i_900);
        Weather i_901 = new Weather("Cold", R.drawable.i_901_cold);
        weatherList.add(i_901);
        Weather i_999 = new Weather("Unknown", R.drawable.i_999_unknown);
        weatherList.add(i_999);
    }
}

效果图如下图所示:
Android学习笔记:RecyclerView_第3张图片

五、点击事件

RecyclerView可以轻松实现子项中任意控件或布局的点击事件,RecyclerView需要针对具体的子项View去注册点击事件,修改WeatherAdapter中的代码,如下图所示:

package com.haobi.recyclerviewdemo;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

/** * Created by 15739 on 2019/8/2. */

public class WeatherAdapter extends RecyclerView.Adapter<WeatherAdapter.ViewHolder> {

    private List<Weather> mWeatherList;

    //静态内部类:可以不依赖于外部类实例化而被实例化
    static class ViewHolder extends RecyclerView.ViewHolder{

        //添加weatherView变量来保存子项最外层布局(图片+文字区域)的实例
        View weatherView;

        ImageView weatherImage;
        TextView weatherName;
        //静态内部类的构造函数
        public ViewHolder(View view){
            //传入的view就是RecyclerView子项的最外层布局
            super(view);
            //根据布局获取布局实例
            weatherView = view;//图片加文字区域
            weatherImage = (ImageView) view.findViewById(R.id.weather_image);
            weatherName = (TextView) view.findViewById(R.id.weather_name);
        }
    }

    //构造函数
    public WeatherAdapter(List<Weather> weatherList){
        //把要展示的数据源传递进来,并赋给一个全局变量mWeatherList
        mWeatherList = weatherList;
    }

    //创建ViewHolder实例
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //加载weather_item布局
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.weather_item, parent, false);
        //创建ViewHolder实例,并将布局传入ViewHolder构造函数
        final ViewHolder holder = new ViewHolder(view);
        holder.weatherView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取position
                int position = holder.getAdapterPosition();
                //通过position获取实例
                Weather weather = mWeatherList.get(position);
                Toast.makeText(v.getContext(), "View:"+weather.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        holder.weatherImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //获取position
                int position = holder.getAdapterPosition();
                //通过position获取实例
                Weather weather = mWeatherList.get(position);
                Toast.makeText(v.getContext(), "Image:"+weather.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        //将ViewHolder实例返回
        return holder;
    }

    //对RecyclerView子项的数据进行赋值,会在每个子项滚动到屏幕内时执行
    @Override
    public void onBindViewHolder(WeatherAdapter.ViewHolder holder, int position) {
        //通过position参数得到当前Weather实例
        Weather weather = mWeatherList.get(position);
        //将数据设置到ViewHolder的ImageView和TextView中
        holder.weatherImage.setImageResource(weather.getImageId());
        holder.weatherName.setText(weather.getName());
    }

    //返回数据源长度
    @Override
    public int getItemCount() {
        //返回RecyclerView一共有多少个子项
        return mWeatherList.size();
    }
}

你可能感兴趣的:(Android,Android,Android学习笔记)