代码地址:
(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一模一样的效果,效果如下图所示:

三、横向滚动

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()方法来设置布局的排列方向,如下所示:

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

效果图如下所示:

四、瀑布流布局

除了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);    }}

效果图如下图所示:

五、点击事件

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

更多相关文章

  1. android ListView增加Animation效果
  2. Android的Layout --- 布局
  3. Android(安卓)PullZoomView:PullToZoomScrollViewEx(2)
  4. Android开发常见错误及技巧
  5. Android判断Activity是否在最上层的方法
  6. Android实现界面跳转功能

随机推荐

  1. 关于ant 打包android引入第三方类库libra
  2. 浅谈Android五大布局(二)——RelativeLayou
  3. Android(安卓)OpenGL自学笔记
  4. Android多线程下安全访问数据库
  5. WakeLock
  6. 显示界面的时候直接获取到EditText焦点弹
  7. Android底部导航栏实现
  8. Android(安卓)Intent 使用 Parcel 反序列
  9. anroid发送短信接口
  10. eclipse 导入Android项目时报告 Invalid