• Android RecyclerView


    简介

      RecyclerView是从Android 5.0开始,谷歌公司推出的一个用于大量数据展示的心控件,在一定程度上可以代替

    传统的ListView,更强大,更灵活

      RecyclerView是v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有Item的的回收复用功能,.

    RecyclerView的优势:

      RecyclerView并不能完全替代ListView,两者的使用场景不一样,相比于Lisetview的优点:

      1.RecyclerView封装了Viewholder的回收复用,也就是说RecyclerView标准化了Viewholder,编写Adapter面向的是Viewholder而不是View.

      2.提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。

      3.设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
    例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。

      4.可设置Item的间隔样式(可绘制)
    通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。

      5.可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。

      但是关于item的点击和长按事件,需要用户自己取实现

    基本使用:

    导入依赖

        implementation 'com.android.support:recyclerview-v7:28.0.0'
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);  
    LinearLayoutManager layoutManager = new LinearLayoutManager(this );  
    //设置布局管理器  
    recyclerView.setLayoutManager(layoutManager);  
    //设置为垂直布局,这也是默认的  
    layoutManager.setOrientation(OrientationHelper. VERTICAL);  
    //设置Adapter  
    recyclerView.setAdapter(recycleAdapter);  
     //设置分隔线  
    recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));  
    //设置增加或删除条目的动画  
    recyclerView.setItemAnimator( new DefaultItemAnimator());

      在使用RecyclerView的时候,必须指定一个适配器和一个布局管理器

      适配器Apdater继承RecyclerView.Adapter类

    创建适配器步骤
      1.创建Adapter继承RecyclerView.Adapter<VH>的Adapter类(VH是ViewHolder的类名)
      2.创建ViewerHolder,继承RecyclerView.ViewHolder实现方式基本与lisetview一样
      3.实现3个方法
        onCreateViewHolder()
        onBindViewHolder()
        getItemCount()
    代码示例:
    package com.hejun.movie;
    
    import android.content.Context;
    import android.content.Intent;
    import android.support.annotation.NonNull;
    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.RatingBar;
    import android.widget.TextView;
    
    import com.bumptech.glide.Glide;
    import com.orhanobut.logger.Logger;
    
    import java.io.Serializable;
    import java.util.List;
    
    
    import butterknife.BindView;
    import butterknife.ButterKnife;
    
    class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> {
    
        private Context context;
        private List<JsonBean.MoviesBean> list;
    
        public GridAdapter(Context context, List<JsonBean.MoviesBean> list) {
            this.context = context;
            this.list = list;
        }
    
        /**
         * 加载item布局
         * @param viewGroup
         * @param i
         * @return
         */
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    
            View view = LayoutInflater.from(context).inflate(R.layout.griditem, viewGroup, false);
            return new ViewHolder(view);
        }
    
        /**
         * 加载数据
         * @param viewHolder
         * @param i
         */
        @Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
    
            final JsonBean.MoviesBean moviesBean = list.get(i);
            Glide.with(context).load(moviesBean.getImageUrl()).into(viewHolder.imag);
            viewHolder.itemText.setText(moviesBean.getTitle());
            viewHolder.stars.setRating((float) (moviesBean.getRating().getAverage() / 2));
            viewHolder.itemText2.setText(String.valueOf(moviesBean.getRating().getAverage()));
    //        Logger.v(String.valueOf((float) moviesBean.getRating().getAverage() / 2));
            //设置item点击事件
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //todo: 跳转详情页面
                    Intent intent = new Intent(context,DetailsActivity.class);
                    intent.putExtra("movies",  moviesBean);
                    context.startActivity(intent);
                }
            });
        }
    
        /**
         * 获取item数量
         * @return
         */
        @Override
        public int getItemCount() {
            return list.size();
        }
    
        /**
         * 自定义ViewHolder
         */
        static class ViewHolder extends RecyclerView.ViewHolder {
            @BindView(R.id.imag)
            ImageView imag;
            @BindView(R.id.item_text)
            TextView itemText;
            @BindView(R.id.stars)
            RatingBar stars;
            @BindView(R.id.item_text2)
            TextView itemText2;
            ViewHolder(@NonNull View itemView) {
                super(itemView);
                ButterKnife.bind(this, itemView);
            }
        }
    }
    LayoutManager 布局管理器
      

    RecyclerView提供了三种布局管理器:

    • LinerLayoutManager 以垂直或者水平列表方式展示Item
    • GridLayoutManager 以网格方式展示Item
    • StaggeredGridLayoutManager 以瀑布流方式展示Item
    LayoutManager常见API
        canScrollHorizontally();//能否横向滚动
        canScrollVertically();//能否纵向滚动
        scrollToPosition(int position);//滚动到指定位置
    
        setOrientation(int orientation);//设置滚动的方向
        getOrientation();//获取滚动方向
    
        findViewByPosition(int position);//获取指定位置的Item View
        findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置
        findFirstVisibleItemPosition();//获取第一个可见Item的位置
        findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置
        findLastVisibleItemPosition();//获取最后一个可见Item的位置

     

  • 相关阅读:
    在C语言中实现面向对象(2)
    OpenGL编程轻松入门之一个简单的例子
    用C结构体来实现面向对象编程,ti xDAIS标准算法就这么搞的(1)
    用C语言显示汉字的演示程序
    VC内存溢出一例 –- 调用约定不一致
    图像的熵、灰度平均值、灰度中值、方差
    Wellner 自适应阈值二值化算法
    对比度保留之彩色图像去色算法---基础算法上档次。
    dm8127-内存分配
    真要救经济,就应该放掉房地产,减税
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/10125997.html
Copyright © 2020-2023  润新知