Android(安卓)使用RecyclerVeiw加载复杂布局
初学Android接触到RecyclerVeiw的时候对它的用法掌握得不是很好,所以这里对RecyclerVeiw的用法做一个小小的总结和复习,网上关于为什么要使用RecyclerVeiw已经有了很多的讲解,在这里也就不多赘述了。^-^ 正文开始
使用RecyclerVeiw首先要在build.gradle中添加依赖
compile 'com.android.support:recyclerview-v7:23.4.0'
Adapter、LayoutManeger
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的位置
更多相关文章
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- python起点网月票榜字体反爬案例
- 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
- android上的http
- android绘画折线图一
- Android开发环境建立2
- TQ210搭载Android(安卓)4.0.3测试Google Maps API V2(一.获取地
- Android中查看和管理sqlite数据库
- android filter