当前位置:   article > 正文

Android学习笔记:RecyclerView_怎么看recyclerview-v7库与com.android.support:appcompat库

怎么看recyclerview-v7库与com.android.support:appcompat库对应

示例代码地址
(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相关的类
类名说明
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'
  • 1

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

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

添加完成后点击同步,随后修改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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

新建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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
<?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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

接下来为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();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68

在上述代码中,首先定义了一个内部类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);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171

至此,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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

接下来,修改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);
    ......
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

效果图如下所示:
在这里插入图片描述


四、瀑布流布局

除了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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

然后,修改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);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172

效果图如下图所示:
在这里插入图片描述


五、点击事件

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/286642
推荐阅读
相关标签
  

闽ICP备14008679号