代码地址:
(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.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()方法来设置布局的排列方向,如下所示:
@Override
protected 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();
}
}