MOMO173
人可能在奔溃的边缘
MOMO
Recycler-更加灵活的listview
Recycler-更加灵活的listview

由于手机屏幕空间有限,无法显示全部内容。当有手机上有大量数据需要展示的时候,则需要借助列表控件。通过手指上下滑动,使得屏幕内外的数据不断进出。
最基本的列表工作模式需要列表控件、数据源,列表控件能够进行交互和展示数据。但是列表控件不与数据源直接打交道,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]说明
最后实现结果是:

https://i.loli.net/2019/05/20/5ce25225c50de23966.png

定义一个实体类

首先我们新建一个实体类,用来作为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,是这个样子的:

https://i.loli.net/2019/05/20/5ce25937821ac61532.png

RecyclerView适配器

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

https://i.loli.net/2019/05/20/5ce21d341c5a373060.png

你需要一个适配器和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);
        }
    }
}

最后没有什么问题的话就应该完成了
附上一个源文件:
下载

没有标签
首页      学习      Recycler-更加灵活的listview
https://secure.gravatar.com/avatar/5967493088983a79f7ef15e91c8e0598?s=256&d=mm&r=g

momo

文章作者

MOMO

Recycler-更加灵活的listview
由于手机屏幕空间有限,无法显示全部内容。当有手机上有大量数据需要展示的时候,则需要借助列表控件。通过手指上下滑动,使得屏幕内外的数据不断进出。 最基本的列表工作模式需要列表控…
扫描二维码继续阅读
2019-05-20
功能
关注我