1. RecyclerView下StaggeredGridLayoutManager基本使用

recyclerView的简单使用在此不多口舌,先初始化StaggeredGridLayoutManager。

@Override

public void InitViewAndData() {

mRecyclerView = f(R.id.rv_attention);

mRefreshLayout = f(R.id.vhrf_attention);

mRecyclerView.setNestedScrollingEnabled(false);

layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);

layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); //防止瀑布流图片闪烁

mRecyclerView.setLayoutManager(layoutManager);

mRecyclerView.setAdapter(mAdapter);

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

@Override

public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

super.onScrollStateChanged(recyclerView, newState);

layoutManager.invalidateSpanAssignments();//防止瀑布流图片闪烁

}

});

}

2. 自定义ViewHolder

recyclerView封装了ViewHolder的回收复用机制,只需要按标准流程实现头部广告位的ViewHolder以及分栏Header条等item的ViewHolder。

public class LiveNoticeVH extends RecyclerView.ViewHolder {

private static final String TAG = "LiveNoticeVH";

private RecyclerView rv_live_notice;

private LiveNoticeAdapter mAdapter;

private TextView tv_header;

private FrameLayout fl_empty_view;

private LinearLayout ll_content_view;

public LiveNoticeVH(View itemView) {

super(itemView);

rv_live_notice = ViewUtils.f(itemView, R.id.rv_live_notice);

tv_header = ViewUtils.f(itemView, R.id.tv_header);

fl_empty_view = ViewUtils.f(itemView, R.id.fl_empty_view);

ll_content_view = ViewUtils.f(itemView, R.id.ll_content_view);

tv_header.setText("关注的直播");

// rv_live_notice.setLayoutManager(new GridLayoutManager(itemView.getContext(),2));

rv_live_notice.setLayoutManager(new LinearLayoutManager(itemView.getContext(), LinearLayoutManager.HORIZONTAL, false));

// rv_live_notice.setNestedScrollingEnabled(false);

mAdapter = new LiveNoticeAdapter(rv_live_notice);

rv_live_notice.setAdapter(mAdapter);

mAdapter.setOnRVItemClickListener(new BGAOnRVItemClickListener() {

@Override

public void onRVItemClick(ViewGroup parent, View itemView, int position) {

try {

SubscriptionInfo item = mAdapter.getItem(position);

if (ICoreManagerBase.getCore(ILivePluginCore.class) != null) {

ICoreManagerBase.getCore(ILivePluginCore.class).getTemplateSelectorInstance().universalToChannel(itemView.getContext(), item.sid, item.ssid, item.liveId, "HomeLiveNoticePush", item.templateId, null);

}

}catch (Exception e){

MLog.info(TAG,"ex="+e);

}

}

});

}

public void setData(List attentionInfoList) {

MLog.info(TAG, "[initData] debug data=" + attentionInfoList);

// MLog.error("LiveNoticeVH","setData size="+attentionInfoList.size());

if (attentionInfoList == null) {

fl_empty_view.setVisibility(View.VISIBLE);

ll_content_view.setVisibility(View.GONE);

} else {

if (attentionInfoList.size() > 0) {

fl_empty_view.setVisibility(View.GONE);

ll_content_view.setVisibility(View.VISIBLE);

// mAdapter.notifyDataSetChanged();

} else {

fl_empty_view.setVisibility(View.VISIBLE);

ll_content_view.setVisibility(View.GONE);

}

}

mAdapter.setData(attentionInfoList);

mAdapter.notifyDataSetChanged();

}

}

3. 构造支持多种item类型的Adapter

从上面的配置我们清楚StaggeredGridLayoutManager显示2列数据,但是Banner位和header条是占据整行的,因此在onCreateViewHolder()里要通过setFullSpan()方式实现单条item占满整行。

public class ShenquAttentionRecyclerAdapter extends RecyclerView.Adapter {

public static final int VIEW_TYPE_LIVE_NOTICE = R.layout.vh_live_notice;

public static final int VIEW_TYPE_ATTENTION_VIDEO = R.layout.vh_attention_video;

public static final int VIEW_TYPE_BASE_HEADER = R.layout.vh_base_header;

public static final int VIEW_TYPE_EMPTY_ATTENTION_VIDEO=R.layout.vh_empty_attention_video;

@Override

public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

if (holder instanceof LiveNoticeVH) {

LiveNoticeVH liveNoticeVH = (LiveNoticeVH) holder;

liveNoticeVH.setData(liveNoticeData);

} else if (holder instanceof AttentionVideoVH && attentionVideoList.size() > 0) {

MLog.debug(TAG, "position=" + position);

AttentionVideoVH attentionVideoVH = (AttentionVideoVH) holder;

attentionVideoVH.initData(attentionVideoList.get(position - count));

holder.itemView.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (mClickListener != null) {

mClickListener.onItemClick(position - count, v, holder);

}

}

});

}else if(holder instanceof EmptyAttentionVideoVH ){

View itemView = holder.itemView;

RecyclerView.LayoutParams param= (RecyclerView.LayoutParams) itemView.getLayoutParams();

if (isHideAttentionView){

param.height = LinearLayout.LayoutParams.WRAP_CONTENT;

param.width = LinearLayout.LayoutParams.MATCH_PARENT;

itemView.setVisibility(View.VISIBLE);

}else{

itemView.setVisibility(View.GONE);

param.height = 0;

param.width = 0;

}

itemView.setLayoutParams(param);

}

}

@Override

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

LayoutInflater inflater = LayoutInflater.from(parent.getContext()); //Inflater为全局单例模式

View itemView = inflater.inflate(viewType, parent, false);

StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) itemView.getLayoutParams();

layoutParams.setFullSpan(true);//将 StaggeredGrid的某个item直接占满宽

if (viewType == VIEW_TYPE_LIVE_NOTICE) { //直播预览

LiveNoticeVH liveNoticeVH = new LiveNoticeVH(itemView);

return liveNoticeVH;

} else if (viewType == VIEW_TYPE_BASE_HEADER) { //标题头

return new BaseHeaderVH(itemView);

} else if (viewType == VIEW_TYPE_ATTENTION_VIDEO) {

AttentionVideoVH attentionVideoVH = new AttentionVideoVH(itemView);

layoutParams.setFullSpan(false);

return attentionVideoVH;

} else return new EmptyAttentionVideoVH(itemView);

}

@Override

public int getItemViewType(int position) {

if (position == 0) {

return VIEW_TYPE_LIVE_NOTICE;

} else if (position == 1) {

return VIEW_TYPE_BASE_HEADER;

}else if(position==2){

return VIEW_TYPE_EMPTY_ATTENTION_VIDEO ;

}

else {

return VIEW_TYPE_ATTENTION_VIDEO;

}

}

}

html瀑布流视频列表,StaggeredGridLayoutManager实现瀑布流视频列表和头部广告位以及分栏Header条...相关推荐

  1. uview 瀑布流_微信小程序瀑布流最好最简单的解决方案

    网上能搜到的小程序瀑布流解决方案,要么代码复杂.逻辑混乱,要么实现不了业务功能,所以把我在项目中的实现方案给大家分享下. 最简单的实现方案,不适用有分页的场景. 这个方案简单的原因是因为仅仅使用了cs ...

  2. Qt编写安防视频监控系统57-子模块1设备列表

    一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...

  3. 在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS)

    在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS) 第一步 用npm装这个几个包 "video.js": "^6.6.0&quo ...

  4. element table多选只能选中当前页数据_关于“列表多选”操作流的小思考

    之前在工作的时候遇到一个问题,在设计列表多选的时候,产品执意要将多选操作的按钮放在列表顶部,但是按照设计规范,该按钮应该是隐藏的,在勾选列表某一行后才会触发显示该按钮,随之产品提出的问题是: &quo ...

  5. 怎么把ppt弄成链接的形式_视频引流的方法,教你怎么用视频引流日引500

    ​大家好,我是聪少,今天来给大家分享一下视频引流的方法,教你怎么用视频引流实现日引500+的粉丝. 文章内容包含这4个部分: 什么是视频引流? 传统视频平台有哪些? 视频引流的原理? 如何实现通过视频 ...

  6. 视频基本术语介绍 码流、帧率、分辨率、I帧、带宽

    视频基本术语介绍 码流 码流Data Rate是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是Kb/s或者Mb/s.一般来说同样分辨 ...

  7. 监控视频中的主码流和子码流是什么意思?

    高清网络摄像机产品编码器都会产生两个编码格式,称为主码流和子码流,这就叫双码流技术.目的是用于解决监控录像的本地存储和网络传输的图像的质量问题. 双码流能实现本地和远程传输的两种不同的带宽码流需求,本 ...

  8. 食品微商怎么靠快手引流,微商如何巧妙借助短视频引流

    播放时间不过几十秒,用户点击量轻松超过十万甚至上百万,这就是短视频的"魔力",做微商的朋友都知道,流量就是生命,每天多加好友,找到精准用户是微商日常必须要做的事情,面对如此火爆的短 ...

  9. 视频号|常见违规限流情况及解除方法

    在视频号创作过程中,大家有没有遇到过视频号限流的问题?或者直接收到过视频号官方发出的违规通知? 视频号被限流,最能在视频播放数据上体现出来.比如,平时的播放数据一直很好,突然间数据就变差了,也不被官方 ...

最新文章

  1. AC日记——传染病控制 洛谷 P1041
  2. 资源2010-01-29
  3. 嵌入式java闹钟 实验报告_《Java程序设计》第五次实验实验报告
  4. 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
  5. 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测
  6. python适合零基础的人吗_学Python需要什么基础知识?零基础可以学Python吗?
  7. Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集
  8. linux nfsnobody用户,处理CentOS 5.5 x64 配置NFS服务过程中nfsnobody用户造成的问题
  9. 前端学习(1865)vue之电商管理系统电商系统之实现表单的数据绑定
  10. Request库入门
  11. sql 2005中全文索引的使用
  12. Robotium测试报告的生成方法(下)
  13. 「镁客早报」小米“10亿赌约”输给格力;SpaceX本周将首次试飞新飞船...
  14. 2021 运维面试1800道题 都掌握 面试已经无敌了 看答案来吧
  15. N个例子让你彻底理解java接口回调
  16. 私有链和联盟链的机会与挑战
  17. html 让360浏览器兼容模式,360浏览器兼容模式怎么设置?360浏览器兼容模式设置方法介绍...
  18. can总线程序讲解_汽车can总线工作原理及测量方法详解
  19. 破局数据库“卡脖子”:专精特新“小巨人”偶数科技迎风成长
  20. JavaScript 每日一题---LeetCode 121. 买卖股票的最佳时机

热门文章

  1. duilib 子窗口位置_duilib各种布局的作用,相对布局与绝对布局的的意义与使用方法...
  2. python处理ppt的插件_几款PPT神器插件,千万不能错过!
  3. api网关选型_微服务 API 网关 APISIX 发布 0.5 版本,达到可用状态
  4. Spring框架及七大模块
  5. java运行python脚本_java调用python脚本,中文变成问号
  6. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(1)
  7. code回归采访哭 ladies_南太铉直播下跪?星船新男团?Mina归队?Kingdom来了?itzy回归?...
  8. 锂电池接线方法图_老电工整理的41条电路接线方法,每一条都值得收藏
  9. UE4 调试着色器编译过程
  10. 利用StringUtils可以避免空指针问题