赞
踩
示例代码地址:
(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架构提供了一种插拔式体验,它具有高度的解耦、异常的灵活性和更高的效率,通过设置它提供的不同LayoutManager、ItemDecoration、ItemAnimator可实现更加丰富多彩的效果。但是RecyclerView也有一定的缺点:①设置列表的分割线时需要自定义(默认没有分隔线);②列表的点击事件需要自己手动实现;
类名 | 说明 |
---|---|
RecyclerView.Adapter | 托管数据集合,为每个Item创建视图 |
RecyclerView.ViewHolder | 承载Item视图的子视图 |
RecyclerView.LayoutManager | 负责Item视图的布局 |
RecyclerView.ItemDecoration | 为每个Item视图添加子布局 |
RecyclerView.ItemAnimator | 负责添加、删除数据时的动画效果 |
(1)Adapter最大的改进就是对ViewHolder进行了封装定义,我们只需要自定义一个ViewHolder继承RecyclerView.ViewHolder就可以了。此外,Adapter继承了RecyclerView.Adapter,在onCreateViewHolder()方法中加载条目布局,在onBindViewHolder()方法中将视图与数据进行绑定。
(2)设置分隔线:谷歌没有提供默认的分隔线,需要我们继承RecyclerView.ItemDecoration来自定义分隔线。只需在调用setAdapter()方法之前使用mRecyclerView.addItemDecoration() 方法来加入分隔线。
(3)使用Adapter的时候,如果采用ViewHolder做缓存,在getView()方法中无论这项convertView的每个子控件是否需要设置属性(比如某个TextView设置的文本可能为null,某个按钮的背景色为透明,某控件的颜色为透明等),都需要为其显式设置属性(TextView的文本为空也需要设置setText(""),背景透明也需要设置),否则在滑动的过程中,因为adapter item复用的原因,会出现内容的显式错乱。
在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(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。