初学Android接触到RecyclerVeiw的时候对它的用法掌握得不是很好,所以这里对RecyclerVeiw的用法做一个小小的总结和复习,网上关于为什么要使用RecyclerVeiw已经有了很多的讲解,在这里也就不多赘述了。^-^  正文开始

使用RecyclerVeiw首先要在build.gradle中添加依赖

compile 'com.android.support:recyclerview-v7:23.4.0'

AdapterLayoutManeger

RecyclerView具有item的回收复用功能,这样可以降低代码的耦合性。RecyclerVeiw很强大,可以实现很多我们想自己定义的布局,Adapter就相当于给我们的加载视图和数据使用的一个适配器。LayoutManeger名为布局管理器,它为我们的recyclerVeiw提供了一个基本的布局。我们可以通过在适配器中写不同的ViewHolder来实现加载不同的布局,从而实现例如淘宝这样复杂的布局(当然也有阿里封装好的v-layout框架 以后有时间再总结T-T)。

一、布局

创建包含recyclerView的布局文件  以及各项item会用到的布局文件

 

二、创建适配器

1、创建Adapter继承RecyclerView.Adapter这里先不用指定泛型

在adapter中要实现以下三个方法:

onCreateViewHolder()

   这个方法主要为每个item生成一个veiw,该f方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,ViewHolder需要我们自己编写。我们这里映射的layout应该为

View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_1, parent, false);

最后一个参数应该为false不能是null

②onBindViewHolder()

   用于绑定数据传入的参数是position和ViewHolder

③getItenCount()

获取item的数目

2、创建自定义的ViewHolder

实现复杂布局就要实现不同种类的ViewHolder并且在实现adapter的onCreateView()onBindViewHolder()方法时根据不同的position来给item设置不同的布局

   创建ViewHolder继承RecyclerView.ViewHolder构造方法一般传入上下文和对应的视图,这里也可以传入数据 但我更习惯将数据单独放在一个setData函数中 在onCreatView()中调用该构造函数初始化布局,在onBindViewholder()中调用setData()来绑定数据。  这里拿一个用于加载banner效果的viewHolder作为例子

    /**     * BannerVeiwHolder     */    class BannerViewHolder extends RecyclerView.ViewHolder {        private Context mContext;        private Banner banner;        public BannerViewHolder(Context mContext, View itemView) {            super(itemView);            this.mContext = mContext;            this.banner = itemView.findViewById(R.id.banner);        }        public void setData(List banner_info) {            //设置banner数据            List imagesUrl = new ArrayList<>();            for (int i = 0; i < banner_info.size(); i++) {                String img = banner_info.get(i).getImage();                Log.e(TAG, "getImage==" + i + "==" + banner_info.get(i).getImage());                imagesUrl.add(img);            }            //设置循环指示点            banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR);            //设置手风琴效果            banner.setBannerAnimation(Transformer.Accordion);            banner.setImages(imagesUrl);            banner.setImageLoader(new ImageLoader() {                @Override                public void displayImage(Context context, Object path, ImageView imageView) {                    //联网请求图片-Glid                    Glide.with(mContext).load(Constants.Base_URl_IMAGE + path).into(imageView);                    Log.e(TAG, "联网请求图片:" + imageView.toString());                }            });            banner.start();            //设置item的点击事件            banner.setOnBannerListener(new OnBannerListener() {                @Override                public void OnBannerClick(int position) {                    Toast.makeText(mContext, "position==" + position, Toast.LENGTH_SHORT).show();                }            });        }    }

定义好BannerViewHolder后我们分别在onCreatVeiw()onBindViewHolder()中初始化视图和绑定数据

@Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == BANNER) {            return new BannerViewHolder(mContext, mLayoutInflater.inflate(R.layout.banner_viewpager, null));        } else if (viewType == ...) {                  //加载其他的ViewHolder        }        return null;    }
 @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {        if (getItemViewType(position) == BANNER) {            BannerViewHolder bannerViewHolder = (BannerViewHolder) holder;            bannerViewHolder.setData(resultBean.getBanner_info());        } else if (getItemViewType(position) == ...) {              //绑定其他数据        }    }

这样我们就基本可以通过recyclerView实现一个较为复杂的布局

三、设置LayoutManager布局管理器

layoutManager负责item的获取与回收  RecyclerView提供了三种布局管理器

  • LinerLayoutManager 线性
  • GridLayoutManager 网格
  • StaggeredGridLayoutManager瀑布流 

LayoutManager常用的一些API

    canScrollHorizontally();//能否横向滚动    canScrollVertically();//能否纵向滚动    scrollToPosition(int position);//滚动到指定位置    setOrientation(int orientation);//设置滚动的方向    getOrientation();//获取滚动方向    findViewByPosition(int position);//获取指定位置的Item View    findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置    findFirstVisibleItemPosition();//获取第一个可见Item的位置    findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置    findLastVisibleItemPosition();//获取最后一个可见Item的位置

 

更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  4. android上的http
  5. android绘画折线图一
  6. Android开发环境建立2
  7. TQ210搭载Android(安卓)4.0.3测试Google Maps API V2(一.获取地
  8. Android中查看和管理sqlite数据库
  9. android filter

随机推荐

  1. AudioTrack::createTrack()
  2. Android(安卓)Studio项目目录结构
  3. setImageResource(),setImageBitmap()和se
  4. android ffmpeg compile error fix notes
  5. android ——设置圆形图片
  6. Android(安卓)Color Palette
  7. android wifi测试小程序
  8. THE 10-STEP GUIDE TO ANNOTATION PROCES
  9. WebView与Android之间的交互(js有效,传值)
  10. RingTest