Recyclerview根据setSpanSizeLookup实现复杂布局(不用嵌套)
来源:互联网 发布:jquery怎么给数组赋值 编辑:程序博客网 时间:2024/06/01 08:16
- 先看效果图:
我们知道实现recyclerview复杂布局,可以用recyclerview嵌套可以实现。
- 注:具体使用嵌套还是本文介绍的这种方法,需要根据项目的需求来确定
本文主要说可以根据布局管理器GridLayoutManager的setSpanSizeLookup方法来动态控制。后面具体介绍。
看下setSpanSizeLookup源码:
/** 设置源获取适配器中每个item占用的跨度数。 * Sets the source to get the number of spans occupied by each item in the adapter. * *用于查询跨越数的实例 每个item占用 * @param spanSizeLookup {@link SpanSizeLookup} instance to be used to query number of spans * * occupied by each item */ public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) { mSpanSizeLookup = spanSizeLookup; }
- 首先我们需要重写两个方法
getItemViewType(int position)和 onAttachedToRecyclerView(RecyclerView recyclerView)
@Override public int getItemViewType(int position) { /** * 根据position设置我们需要的itemtype * */ //例如: if (position==0){ return TYPE_SLIDER;//轮播图 } }
onAttachedToRecyclerView:
@Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if (manager instanceof GridLayoutManager) { final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { /** * 根据GridLayoutManager的getSpanSize方法可以动态的设置item跨列数 * 需要设置:4个参数的GridLayoutManager * new GridLayoutManager(getActivity(),6,GridLayoutManager.VERTICAL,false); * 这里的6(自己设置的最好设置成偶数)就相当于分母,6默认显示一整行(1列),下面的3 和2 就相当于分子,返回3就是(1/2)所以此类型对应的是2列,返回2就是(1/3)所以此类型对应的是3列 * */ //例如:根据getItemViewType返回的itemtype,第一个position显示为轮播图,所以返回的是gridManager.getSpanCount();(即:6) int type = getItemViewType(position); switch (type) { case TYPE_SLIDER: //这里的轮播图类型和head 返回默认的spansize(即是6) return gridManager.getSpanCount(); //如果要显示两列就返回3 3除以6 二分之一 } } }); } }
setSpanSizeLookup:这个方法,在上面的源码中我们可以看到,主要是控制每个item占用的跨度数
- 奉上适配器完整代码
/** * Created by sswl on 2017/5/3. */public class OneAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements BaseSliderView.OnSliderClickListener{ public static final int TYPE_SLIDER = 0x001; public static final int TYPE_TYPE2_HEAD = 0x002; public static final int TYPE_TYPE2 = 0x003; public static final int TYPE_TYPE3_HEAD = 0x004; public static final int TYPE_TYPE3 = 0x005; public static final int TYPE_TYPE4 = 0x006; private Context mCtx; private final LayoutInflater inflater; public OneAdapter(Context mCtx){ this.mCtx=mCtx; inflater = LayoutInflater.from(mCtx); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { switch (viewType){ case TYPE_SLIDER://轮播图 return new SliderViewHolder(inflater.inflate(R.layout.slider_type,parent,false)); case TYPE_TYPE2_HEAD: case TYPE_TYPE3_HEAD://head 头布局 return new HeadViewHolder(inflater.inflate(R.layout.headtitle_item,parent,false)); case TYPE_TYPE2: case TYPE_TYPE3: case TYPE_TYPE4: return new TypeViewHolder(inflater.inflate(R.layout.one_item_type_1,parent,false)); default: return null; } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof SliderViewHolder){ bindItemTypeSlider((SliderViewHolder) holder, position); }else if (holder instanceof HeadViewHolder){ bindType1Head((HeadViewHolder) holder, position); }else if (holder instanceof TypeViewHolder){ bindType1((TypeViewHolder) holder, position); } } private void bindType1(TypeViewHolder holder, int position) { } private void bindType1Head(HeadViewHolder holder, int position) { } /** * 实现轮播图 * */ private void bindItemTypeSlider(SliderViewHolder holder, int position) { //这里可以进行网络操作 HashMap<String,String> url_maps = new HashMap<String, String>(); url_maps.put("轮播图1", "http://static2.hypable.com/wp-content/uploads/2013/12/hannibal-season-2-release-date.jpg"); url_maps.put("轮播图2", "http://cdn3.nflximg.net/images/3093/2043093.jpg"); url_maps.put("轮播图3", "http://images.boomsbeat.com/data/images/full/19640/game-of-thrones-season-4-jpg.jpg"); for(String name : url_maps.keySet()){ DefaultSliderView sliderView = new DefaultSliderView(mCtx);// TextSliderView textSliderView = new TextSliderView(this); sliderView .description(name) .image(url_maps.get(name)) .setScaleType(BaseSliderView.ScaleType.Fit).setOnSliderClickListener(this); //add your extra information 点击图片时可用到 sliderView.bundle(new Bundle()); sliderView.getBundle() .putString("extra",name); holder.slider.setDuration(4000); holder.slider.addSlider(sliderView); } } @Override public int getItemCount() { return 41; } @Override public int getItemViewType(int position) { /** * 指定position显示返回对应的itemType * */ if (position==0){ return TYPE_SLIDER; }else if(position==1){ return TYPE_TYPE2_HEAD; }else if(position>=2 && position<=7){ return TYPE_TYPE2; }else if(position==8){ return TYPE_TYPE3_HEAD; }else if(position>=9 && position<=14){ return TYPE_TYPE3; }else if (15<=position && position <= 18){ return TYPE_TYPE4; }else { return TYPE_TYPE2; } } @Override public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); RecyclerView.LayoutManager manager = recyclerView.getLayoutManager(); if (manager instanceof GridLayoutManager) { final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { int type = getItemViewType(position); /** * 根据GridLayoutManager的getSpanSize方法可以动态的设置item跨列数 * 需要设置:4个参数的GridLayoutManager * new GridLayoutManager(getActivity(),6,GridLayoutManager.VERTICAL,false); * 这里的6(自己设置的最好设置成偶数)就相当于分母,6默认显示一整行(1列),下面的3 和2 就相当于分子,返回3就是(1/2)所以此类型对应的是2列,返回2就是(1/3)所以此类型对应的是3列 * */ switch (type) { case TYPE_SLIDER: case TYPE_TYPE2_HEAD: case TYPE_TYPE3_HEAD: case TYPE_TYPE4: //这里的轮播图类型和head 返回默认的spansize(即是6) return gridManager.getSpanCount(); case TYPE_TYPE2: return 3; case TYPE_TYPE3: return 2; default: //默认显示2列 return 3; } } }); } } /** * 轮播图点击事件 * */ @Override public void onSliderClick(BaseSliderView slider) { Toast.makeText(mCtx,slider.getBundle().get("extra") + "", Toast.LENGTH_SHORT).show(); } /* * 轮播图 * */ class SliderViewHolder extends RecyclerView.ViewHolder{ public SliderLayout slider; public SliderViewHolder(View itemView) { super(itemView); slider = (SliderLayout) itemView.findViewById(R.id.slider); } } /** * head * */ class HeadViewHolder extends RecyclerView.ViewHolder{ public ImageView image; public HeadViewHolder(View itemView) { super(itemView); } } /** * 条目显示占多少列(这里由 setSpanSizeLookup动态控制) * */ class TypeViewHolder extends RecyclerView.ViewHolder{ public ImageView image; public TypeViewHolder(View itemView) { super(itemView); image= (ImageView) itemView.findViewById(R.id.item_img_type1); } }}
到这里结束了!主要介绍了主要的思路!
本人描述能力有限,欢迎吐槽!
- 最后奉上demo:http://download.csdn.net/download/qq_34501274/9834284
0 0
- Recyclerview根据setSpanSizeLookup实现复杂布局(不用嵌套)
- RecyclerView实现复杂布局
- 不一样的RecyclerView优雅实现复杂列表布局(一)
- 不一样的RecyclerView优雅实现复杂列表布局(二)
- SwipeRefreshLayout嵌套ScrollView包裹复杂头布局和RecyclerView
- SwipeRefreshLayout嵌套ScrollView包裹复杂头布局和RecyclerView
- 学习RecyclerView优雅实现复杂列表布局
- RecyclerView实现复杂首页(条目)布局
- recyclerView实现复杂布局的好处
- 优雅地实现RecyclerView的复杂布局
- 强大的RecyclerView实现复杂布局
- RecyclerView 中setSpanSizeLookup 解释
- android RecyclerView GridLayoutManager setSpanSizeLookup 不执行(不调用)
- RecyclerView下实现 ListView嵌套GridView 复杂效果
- Recycleview实现复杂页面 三种以上布局 瀑布流 多布局 scrollview嵌套recyclerView 显示不全 滑动冲突 之进阶终极篇
- ScrollView嵌套复杂布局
- (转)RecyclerView 中setSpanSizeLookup 解释
- RecyclerView GridLayoutManager实现复杂的列数变化的布局
- 30多年的程序员生涯总结
- W大姐的面试题
- Hive分析函数row_number()
- 深度学习与人脸识别系列(4)__vgg人脸识别模型测试
- 数据结构基础概念
- Recyclerview根据setSpanSizeLookup实现复杂布局(不用嵌套)
- HoloLens开发——三维模型导入Unity3d问题
- C#委托
- 深度学习与人脸识别系列(5)__利用训练好的vgg模型进行人脸识别(利用摄像头)
- 我喜欢的
- C++第五次作业数组1
- 【c++】模板和模板类
- CentOS6.5安装与配置Mysql数据库
- mysql删除记录后,添加记录调过删除id.如何重新排序.