html瀑布流视频列表,StaggeredGridLayoutManager实现瀑布流视频列表和头部广告位以及分栏Header条...
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条...相关推荐
- uview 瀑布流_微信小程序瀑布流最好最简单的解决方案
网上能搜到的小程序瀑布流解决方案,要么代码复杂.逻辑混乱,要么实现不了业务功能,所以把我在项目中的实现方案给大家分享下. 最简单的实现方案,不适用有分页的场景. 这个方案简单的原因是因为仅仅使用了cs ...
- Qt编写安防视频监控系统57-子模块1设备列表
一.前言 近期在经历过这次UI大重构以后,很多拆分的功能都以单独的模块的形式出现,以悬停窗体的形式嵌入或者悬浮在主窗体中,这种方式极大的增强了系统的拓展性,客户想要什么模块就开启什么模块,放置到合适的 ...
- 在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS)
在vue中使用海康插件实现视频监控,视频直播方法一(RTMP流加Flash加videoJS) 第一步 用npm装这个几个包 "video.js": "^6.6.0&quo ...
- element table多选只能选中当前页数据_关于“列表多选”操作流的小思考
之前在工作的时候遇到一个问题,在设计列表多选的时候,产品执意要将多选操作的按钮放在列表顶部,但是按照设计规范,该按钮应该是隐藏的,在勾选列表某一行后才会触发显示该按钮,随之产品提出的问题是: &quo ...
- 怎么把ppt弄成链接的形式_视频引流的方法,教你怎么用视频引流日引500
大家好,我是聪少,今天来给大家分享一下视频引流的方法,教你怎么用视频引流实现日引500+的粉丝. 文章内容包含这4个部分: 什么是视频引流? 传统视频平台有哪些? 视频引流的原理? 如何实现通过视频 ...
- 视频基本术语介绍 码流、帧率、分辨率、I帧、带宽
视频基本术语介绍 码流 码流Data Rate是指视频文件在单位时间内使用的数据流量,也叫码率或码流率,是视频编码中画面质量控制中最重要的部分,一般我们用的单位是Kb/s或者Mb/s.一般来说同样分辨 ...
- 监控视频中的主码流和子码流是什么意思?
高清网络摄像机产品编码器都会产生两个编码格式,称为主码流和子码流,这就叫双码流技术.目的是用于解决监控录像的本地存储和网络传输的图像的质量问题. 双码流能实现本地和远程传输的两种不同的带宽码流需求,本 ...
- 食品微商怎么靠快手引流,微商如何巧妙借助短视频引流
播放时间不过几十秒,用户点击量轻松超过十万甚至上百万,这就是短视频的"魔力",做微商的朋友都知道,流量就是生命,每天多加好友,找到精准用户是微商日常必须要做的事情,面对如此火爆的短 ...
- 视频号|常见违规限流情况及解除方法
在视频号创作过程中,大家有没有遇到过视频号限流的问题?或者直接收到过视频号官方发出的违规通知? 视频号被限流,最能在视频播放数据上体现出来.比如,平时的播放数据一直很好,突然间数据就变差了,也不被官方 ...
最新文章
- AC日记——传染病控制 洛谷 P1041
- 资源2010-01-29
- 嵌入式java闹钟 实验报告_《Java程序设计》第五次实验实验报告
- 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测
- python适合零基础的人吗_学Python需要什么基础知识?零基础可以学Python吗?
- Jerry的通过CDS view + Smart Template 开发Fiori应用的blog合集
- linux nfsnobody用户,处理CentOS 5.5 x64 配置NFS服务过程中nfsnobody用户造成的问题
- 前端学习(1865)vue之电商管理系统电商系统之实现表单的数据绑定
- Request库入门
- sql 2005中全文索引的使用
- Robotium测试报告的生成方法(下)
- 「镁客早报」小米“10亿赌约”输给格力;SpaceX本周将首次试飞新飞船...
- 2021 运维面试1800道题 都掌握 面试已经无敌了 看答案来吧
- N个例子让你彻底理解java接口回调
- 私有链和联盟链的机会与挑战
- html 让360浏览器兼容模式,360浏览器兼容模式怎么设置?360浏览器兼容模式设置方法介绍...
- can总线程序讲解_汽车can总线工作原理及测量方法详解
- 破局数据库“卡脖子”:专精特新“小巨人”偶数科技迎风成长
- JavaScript 每日一题---LeetCode 121. 买卖股票的最佳时机
热门文章
- duilib 子窗口位置_duilib各种布局的作用,相对布局与绝对布局的的意义与使用方法...
- python处理ppt的插件_几款PPT神器插件,千万不能错过!
- api网关选型_微服务 API 网关 APISIX 发布 0.5 版本,达到可用状态
- Spring框架及七大模块
- java运行python脚本_java调用python脚本,中文变成问号
- SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(1)
- code回归采访哭 ladies_南太铉直播下跪?星船新男团?Mina归队?Kingdom来了?itzy回归?...
- 锂电池接线方法图_老电工整理的41条电路接线方法,每一条都值得收藏
- UE4 调试着色器编译过程
- 利用StringUtils可以避免空指针问题