zoukankan      html  css  js  c++  java
  • 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的位置

     

  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/10125997.html
Copyright © 2011-2022 走看看