由于手机屏幕空间有限,无法显示全部内容。当有手机上有大量数据需要展示的时候,则需要借助列表控件。通过手指上下滑动,使得屏幕内外的数据不断进出。
最基本的列表工作模式需要列表控件、数据源,列表控件能够进行交互和展示数据。但是列表控件不与数据源直接打交道,Adapter 接口充当桥梁
RecyclerView 集成自 ViewGroup 。能配合任何基于adapter的view实现多种布局
RecyclerView是Android-support-V7版本中新增的一个Widgets,官方对于它的介绍是:RecyclerView是ListView的升级版本,更加先进和灵活。
Recycler是L之后加入的,而它就被加在了v7支持包里面,所以要使用它则是要在build.gradle中加上:
implementation 'com.android.support:recyclerview-v7:28.0.0'
同ListView一样,RecyclerView也需要使用Adapter。Adapter的作用主要是负责一个item中视图的布局以及信息的展示。
ListView 的 adapter的和RecyclerView 的 adapter是不一样的,具体的用实例说,新建一个RecyclerViewTest[1]说明
最后实现结果是:

定义一个实体类
首先我们新建一个实体类,用来作为Recycler适配器的适配类型,新建Fruit类:
package com.example.recyclerviewtest;
public class Fruit {
private String name;
private int imageId;
//重写构建函数
public Fruit(String name,int imageId){
this.name = name;
this.imageId = imageId;
}
//获取名字
public String getname(){
return name;
}
public int getImageId(){
return imageId;
}
}
首先重写这个类的构造函数,后期我们就使用这个类来进行数据的处理
然后又写了两个返回的方法,可以把当前的名字和图片返回;
在布局添加一个Recycler
这个就很简单,修改项目里面的activity_main.xml
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view"/>
</LinearLayout>
首先要注意的是,由于RecyclerView不是在内置SDK里面的,所以要把它的完整包名写出来
然后修改它的宽度和长度,我们这里设置成全屏,顺便给他上个id,等下我们需要用到
这里顺便加上一个新的布局:给RecyclerView的每一项设置一个布局
新建一个文件fruit_item.xml:
<?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"
android:layout_margin="5dp"
>
<ImageView
android:id="@+id/fruit_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/fruit_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"
/>
</LinearLayout>
就是直接写了一个imageview和textview,是这个样子的:

RecyclerView适配器
RecyclerView.Apdater的实现用于处理数据集与ItemView的绑定关系

你需要一个适配器和RecyclerView中的数据绑定
新建一个FruitAdapter类:
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder>{
//自定义的适配器,继承于RecyclerView.Adapter
//<>里的本来应该是RecyclerView.ViewHolder,但是我们在RecyclerAdapter里定义了一个内部类FruitAdapter.ViewHolder,
//使其继承了RecyclerView.ViewHolder,所以我们就可以在尖括号里直接调用内部类
private List<Fruit> mFruitList;
static class ViewHolder extends RecyclerView.ViewHolder{
//添加fruitImage变量
ImageView fruitImage;
//添加fruitName变量
TextView fruitName;
//定义内部类ViewHolder,ViewHolder要继承RecylerView.ViewHolder,然后构造函数传入一个view参数
public ViewHolder(View view){
super(view);
//再通过这个方法获取布局中的imageView和TextView实例
fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
fruitName = (TextView)view.findViewById(R.id.fruit_name);
}
}
//重写构造函数,来存储传过来的值,后续都在这上面改
public FruitAdapter(List<Fruit> fruitList){
mFruitList = fruitList;
}
/*由于继承于RecyclerView.Adapter,则必须重写onCreateViewHolder、onBindViewHolder、getItemCount这三个方法*/
/*onCreateViewHolder首先就是通过LayoutInflater.from()方法接收一个context,之后,再通过inflate将item布局放进总布局中之后再将这个view作为参数传到ViewHolder中去,同时,返回一个ViewHolder
简单来说就是对RecyclerView的单项布局进行绑定
*/
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
//对传入RecyclerView子项的数据进行赋值,会在每个子项被滚动到屏幕内的时候执行,通过position获得当前Fruit的实例,也就是onBindViewHolder方法则负责将数据与ViewHolder绑定
@Override
public void onBindViewHolder( ViewHolder holder, int position) {
Fruit fruit = mFruitList.get(position);
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getname());
}
//用于告诉RecyclerView有多少个子项,直接放回数据源长度
@Override
public int getItemCount() {
return mFruitList.size();
}
}
适配器准备好之后我们就可以准备使用RecyclerView了
导入数据和使用RecyclerView
修改mainActivity.java:
public class MainActivity extends AppCompatActivity {
private List<Fruit> fruitList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initFruits();//初次化水果的数据
//下面是关于如何把数据通过Adapter导入到RecyclerView
RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);//获取RecyclerView的实例
//创建LinearLayoutManager对象
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//用于指定RecyclerView的布局方式
recyclerView.setLayoutManager(layoutManager);
//创建FruitAdapter实例,并把数据传入FruitAdapter的构造函数中
FruitAdapter adapter = new FruitAdapter(fruitList);
/*调用layoutManager的setOrientation()方法来设置布局排列
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);*/
//调用setAdapter方式完成适配器设置
recyclerView.setAdapter(adapter);
}
private void initFruits(){
for(int i = 0;i<2;i++){
Fruit apple = new Fruit("Apple", R.drawable.apple_pic);
fruitList.add(apple);
Fruit banana = new Fruit("Banana", R.drawable.banana_pic);
fruitList.add(banana);
Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
fruitList.add(orange);
Fruit watermelon = new Fruit("Watermelon", R.drawable.watermelon_pic);
fruitList.add(watermelon);
Fruit pear = new Fruit("Pear",R.drawable.pear_pic);
fruitList.add(pear);
Fruit grape = new Fruit("Grape", R.drawable.grape_pic);
fruitList.add(grape);
Fruit pineapple = new Fruit("Pineapple", R.drawable.pineapple_pic);
fruitList.add(pineapple);
Fruit strawberry = new Fruit("Strawberry", R.drawable.strawberry_pic);
fruitList.add(strawberry);
Fruit cherry = new Fruit("Cherry", R.drawable.cherry_pic);
fruitList.add(cherry);
Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
fruitList.add(mango);
}
}
}
最后没有什么问题的话就应该完成了
附上一个源文件:
下载