博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
界面无小事(二): 让RecyclerView展示更多不同视图
阅读量:7091 次
发布时间:2019-06-28

本文共 4524 字,大约阅读时间需要 15 分钟。

目录

  • 前言
  • GridLayoutManager的使用
  • Glide加载图片
  • 让RecyclerView支持更多不同布局
  • 来看看横向滚动
  • 还有瀑布流
  • 最后

前言

之前设置布局的时候用了最简单的LinearLayoutManager, 而且是单一布局, 这次来感受下GridLayoutManager和瀑布流以及多布局.


GridLayoutManager的使用

比起LinearLayoutManager, GridLayoutManager可以适用的场景就更多了. 来看一段代码:

RecyclerView rvTest = (RecyclerView) findViewById(R.id.rv_test);//rvTest.setLayoutManager(new LinearLayoutManager(this));final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2);rvTest.setLayoutManager(gridLayoutManager);final MyRVAdapter myRVAdapter = new MyRVAdapter(this);if (gridLayoutManager != null) {    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {        @Override        public int getSpanSize(int position) {            if (position == 0                    || position == 4                    || position == (myRVAdapter.getItemCount() - 1)) {                return gridLayoutManager.getSpanCount();            } else {                return 1;            }        }    });}rvTest.setAdapter(myRVAdapter);

将原本的LinearLayoutManager替换为GridLayoutManager, 并将0和4以及最后一个条目设置为填充父容器. 来看看效果图:

效果图
效果图

Glide加载图片

这是谷歌推荐的一个图片加载库. 我个人的评价就是, 异常强大, 可以满足各种花式加载. 而这里我们只是简单用一下, 不细说.

在构建当中加入:

compile 'com.github.bumptech.glide:glide:3.7.0'

使用类似:Glide.with(context).load(R.drawable.pic).centerCrop().into(imageView);加载即可. 第一个参数是上下文, 第二个参数是图片资源, 第三个参数是ImageView控件.


让RecyclerView支持更多不同布局

快速写一个带图布局:

getItemViewType用来设置视图的类型. 这里我们把0, 4, 和最后一个设置为图片型. 和之前在GridLayoutManager中设置填充父容器的position一样.

public enum ITEM_TYPE {    ITEM_TYPE_IMAGE,    ITEM_TYPE_TEXT}private int[] mImageId = {R.drawable.test, R.drawable.test2, R.drawable.test3};
@Overridepublic int getItemViewType(int position) {    if (position == 0 || position == 4 || position == (getItemCount() - 1)) {        return ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal();    } else {        return ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();    }}

添加一个新的viewHolder:

public static class MyTVHolder extends RecyclerView.ViewHolder {    TextView mTextView;    public MyTVHolder(View itemView) {        super(itemView);        mTextView = (TextView) itemView.findViewById(R.id.tv_test);    }}public static class MyIVHolder extends RecyclerView.ViewHolder {    TextView mTextView;    ImageView mImageView;    MyIVHolder(View view) {        super(view);        mTextView = (TextView) view.findViewById(R.id.tv_test);        mImageView = (ImageView) view.findViewById(R.id.iv_test);    }}

然后就是修改onCreateViewHolder和onBindViewHolder部分, 区别处理文字item带图item, 顺带一提, 类上继承的RecyclerView.Adapter的泛型要变更, public class MyRVAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>:

@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    if (viewType == ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()) {        return new MyIVHolder(mLayoutInflater.inflate(R.layout.rv_image_item, parent, false));    } else {        return new MyTVHolder(mLayoutInflater.inflate(R.layout.rv_item, parent, false));    }}
@Overridepublic void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {    if (holder instanceof MyTVHolder) {        ((MyTVHolder) holder).mTextView.setText(mArray[position]);    } else if (holder instanceof MyIVHolder) {        Glide.with(mContext)                .load(mImageId[position % 3])                .centerCrop()                .into(((MyIVHolder) holder).mImageView);        ((MyIVHolder) holder).mTextView.setText(mArray[position]);    }    if (mOnItemClickListener != null) {        holder.itemView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                int pos = holder.getLayoutPosition();                mOnItemClickListener.onItemClick(holder.itemView, pos);            }        });        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                int pos = holder.getLayoutPosition();                mOnItemClickListener.onItemLongClick(holder.itemView, pos);                return false;            }        });    }}

其实目的就是根据getItemViewType的设置加载不同布局. 来看看效果图:

不同布局加载
不同布局加载

来看看横向滚动

一行代码足矣:

gridLayoutManager.setOrientation(GridLayoutManager.HORIZONTAL);

横着滚
横着滚

还有瀑布流

对, 还有瀑布流. 记得注释掉GridLayoutManager设置宽度那部分.

StaggeredGridLayoutManager layoutManager                = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);        rvTest.setLayoutManager(layoutManager);
瀑布流
瀑布流

最后

这是第二篇的全部内容, 感兴趣的还有第三篇哦, 或者你还没有看如果喜欢记得点赞或者关注我哦.


转载地址:http://jqiql.baihongyu.com/

你可能感兴趣的文章
关于Patter类和Match类
查看>>
Linux下iptables的简介和自己的记录
查看>>
类的operator new与operator delete的重载
查看>>
tn文本分析语言(三):高级语法
查看>>
iOS:提示框(警告框)控件UIActionSheet的详解
查看>>
分析Linux内核创建一个新进程的过程【转】
查看>>
Web API应用架构设计分析(2)
查看>>
.NET插件系统之二——不实例化获取插件信息和可视化方法
查看>>
让asp.net默认的上传组件支持进度条反映
查看>>
EXTJS学习系列提高篇:第十一篇(转载)作者殷良胜,制作树形菜单之五
查看>>
从代码分析Android-Universal-Image-Loader的图片加载、显示流程
查看>>
阿里妈妈首次公开新一代自研智能检索模型 | WWW 2018论文解读
查看>>
使用Depth Texture
查看>>
第 9 章 PBX
查看>>
ylbtech-LanguageSamples-Porperties(属性)
查看>>
第 4 章 Music score
查看>>
架构设计目录
查看>>
Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
查看>>
学习笔记: CSS3 鼠标悬停动画
查看>>
ylbtech-cnblogs(博客园)-数据库设计-7,News(新闻)
查看>>