美文网首页Android开发
《第一行代码》笔记3.1—UI控件之—RecyclerView

《第一行代码》笔记3.1—UI控件之—RecyclerView

作者: aasdfghjkll | 来源:发表于2019-02-17 22:58 被阅读9次

    比ListView更强大的滚动控件——RecyclerView

    它优化了ListView中存在的需要技巧提升效率、不能横向滚动的不足。

    1. 用RecyclerView实现ListView的效果

    使用步骤:

    1-添加依赖

    将RecyclerView定义在support库中,使其可以在所有Android版本上都能使用,所以在build.gradle中添加依赖。

    2-在layout中引用

    由于它不是内置在SDK中,在layout中引用时需要用完整包路径。

    3-为RecyclerView准备适配器

    RecyclerView适配器继承自RecyclerView.Adapter,泛型指定为FruitAdapter.ViewHolder,其中ViewHolder是FruitAdapter类中定义的内部类,继承自RecyclerView.Viewholder。

    这里泛型指定为FruitAdapter.ViewHolder,系统会使用在FruitAdapter中定义的ViewHolder类;如果没有指定的话,系统会使用RecyclerView.ViewHolder类,这样在两个重写的方法中的返回值也会是RecyclerView.ViewHolder类。

    ViewHolder类中主要是在onCreateViewHolder()方法把通过LayoutInflate...from...inflate()加载好的布局View传入ViewHolder的构造方法中后,通过findViewById()方法加载View所对应的子类的布局,方便后续onBindViewHolder()方法中对子类布局赋值。

    由于FruitAdapter是继承自RecyclerView.Adapter的,所以必须重写onCreateViewHolder()、onBindViewHolder()和getItemCount()这三个方法。

    onCreateViewHolder():
    用于创建ViewHolder实例,这个方法中将fruitItem布局加载进来,然后创建一个ViewHolder实例,并把加载出来的布局传入ViewHolder构造函数当中,最后将ViewHolder的实例返回。

    onBindViewHolder():

    用于对RecyclerView子项的数据进行赋值的,会在每个子项被滚动到屏幕内的时候执行

    getItemCount():
    告诉RecyclerView一共有多少子项,返回数据源的长度就可以了

    到这里适配器就配好了:

    public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    
        private List<Fruit> fruitList;
        static class ViewHolder extends RecyclerView.ViewHolder{
            ImageView fruitImage;
            TextView fruitName;
    
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                fruitImage = itemView.findViewById(R.id.fruit_image);
                fruitName = itemView.findViewById(R.id.fruit_name);
            }
        }
    
        public FruitAdapter(List<Fruit> fruitList) {
            this.fruitList=fruitList;
        }
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
            View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fruit_item,viewGroup,false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
            Fruit fruit = fruitList.get(i);
            viewHolder.fruitImage.setImageResource(fruit.getImageId());
            viewHolder.fruitName.setText(fruit.getName());
        }
    
    
        @Override
        public int getItemCount() {
            return fruitList.size();
        }
    }
    

    4.修改RecyclerViewActivity中的代码,开始使用RecyclerView

    package com.example.test.RecyclerView;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    
    import com.example.test.uidemo.R;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class RecyclerViewActivity extends Activity {
    
        private List<Fruit> fruitList = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recycler_view);
    
            //初始化水果数据
            initFruit();
    
            //开始使用RecyclerView
            RecyclerView recyclerView = findViewById(R.id.recycler_view);
            //LayoutManager用于指定RecyclerView的布局方式,这里指定线性布局,可以实现和ListView类似的效果,
            //如果不指定,界面会一片空白
            RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
            recyclerView.setLayoutManager(layoutManager);
            FruitAdapter fruitAdapter = new FruitAdapter(fruitList);
            recyclerView.setAdapter(fruitAdapter);
    
        }
    
        private void initFruit() {
            Fruit apple = new Fruit("apple", R.drawable.apple);
            fruitList.add(apple);
            Fruit banana = new Fruit("banana", R.drawable.banana);
            fruitList.add(banana);
            Fruit grape = new Fruit("grape", R.drawable.grape);
            fruitList.add(grape);
            Fruit orange = new Fruit("orange", R.drawable.orange);
            fruitList.add(orange);
            Fruit peach = new Fruit("peach", R.drawable.peach);
            fruitList.add(peach);
            Fruit pear = new Fruit("pear", R.drawable.pear);
            fruitList.add(pear);
            Fruit pineapple = new Fruit("pineapple", R.drawable.pineapple);
            fruitList.add(pineapple);
            Fruit watermelon = new Fruit("watermelon", R.drawable.watermelon);
            fruitList.add(watermelon);
        }
    }
    
    

    界面效果如图所示:


    用recyclerview实现listview和线性布局的效果

    2. 用RecyclerView实现横向滚动

    只需要为layoutManager添加一条如下方法,设置它的方向是水平的,就可以实现了,不过要记得将item中的控件宽度改为wrap_content

    (new LinearLayoutManager(this)).setOrientation(LinearLayoutManager.HORIZONTAL);
    

    3.用RecyclerView实现瀑布流布局

    也是在实现ListView的基础上进行少量变化

    • 将布局管理器从LinearLayoutManager换成StaggeredGridLayoutManager:
            StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
    
    

    其中第一个参数表示瀑布流的列数,这里是3列;第二个参数表示是竖向瀑布流

    • 增加一个getRandomLengthName(String name)方法用于改变界面中文字的高度,显示参差不齐的效果
    • 用该方法替换item中TextView的字符串
      如图所示:

    效果如图:


    竖向瀑布流效果图

    4. RecyclerView的点击事件

    RecyclerView没有类似于OnItemClickListner()的注册监听器方法,但是在点击每一项里具体的一个控件时,RecyclerView更加方便,因为RecyclerView直接用具体的View去注册点击事件,可以轻松实现子项中任意控件或布局的点击事件
    重点:

    • 在Viewholder类中保存了子项 最外层布局的实例
    • 在onCreateViewHolder中注册监听事件

    效果:


    先点击了图片,又点击了文字部分(相当于点击了外层布局)

    完结(ง •_•)ง

    相关文章

      网友评论

        本文标题:《第一行代码》笔记3.1—UI控件之—RecyclerView

        本文链接:https://www.haomeiwen.com/subject/oczneqtx.html