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;

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
功能是指将页面分成多个部分,每个部分可以独立滚动,常用于多列布局。在 Node.js 中实现功能需要使用 HTML、CSS 和 JavaScript。 首先,创建一个 HTML 文件,并在其中添加多个 div 元素,每个元素代表一个目。给每个 div 元素设置相同的 class 属性,这样可以方便地对所有目进行样式设置。 ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>分功能</title> <style> .column { float: left; width: 33.33%; height: 300px; overflow-y: auto; } </style> </head> <body> <div class="column"> <p>第一内容</p> </div> <div class="column"> <p>第二内容</p> </div> <div class="column"> <p>第三内容</p> </div> <script> // 在此处添加 JavaScript 代码 </script> </body> </html> ``` 上述代码中,我们定义了一个名为 column 的 class,它包含了以下样式设置: - float: left; 表示让元素左浮动,使它们排列在同一行; - width: 33.33%; 表示每个元素的宽度为屏幕宽度的三分之一; - height: 300px; 表示每个元素的高度为 300 像素; - overflow-y: auto; 表示当内容溢出时显示滚动条。 接下来,我们需要使用 JavaScript 实现的滚动联动效果。具体做法是监听每个目的滚动事件,当一个目滚动时,其他目也跟随滚动。代码如下: ```javascript var columns = document.querySelectorAll('.column'); for (var i = 0; i < columns.length; i++) { columns[i].addEventListener('scroll', function () { var scrollTop = this.scrollTop; for (var j = 0; j < columns.length; j++) { if (columns[j] !== this) { columns[j].scrollTop = scrollTop; } } }); } ``` 上述代码中,我们使用 document.querySelectorAll 方法选取所有 class 为 column 的元素,并使用 for 循环为每个元素添加滚动事件监听器。在监听器中,我们获取当前元素的 scrollTop 属性,表示滚动条距离顶部的距离,然后将其赋值给其他元素的 scrollTop 属性,实现滚动联动效果。 最后,将 HTML 文件保存为 .html 格式,用 Node.js 运行该文件即可看到分功能的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值