BaseRecyclerViewAdapterHelper源码解读(五) header和footer完善(1)

最后

由于篇幅限制,小编在此截出几张知识讲解的图解

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

P8级大佬整理在Github上45K+star手册,吃透消化,面试跳槽不心慌

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • When set to true, the item will layout using all span area. That means, if orientation

  • is vertical, the view will have full width; if orientation is horizontal, the view will

  • have full height.

  • if the hold view use StaggeredGridLayoutManager they should using all span area

  • @param holder True if this item should traverse all spans.

*/

protected void setFullSpan(RecyclerView.ViewHolder holder) {

if (holder.itemView.getLayoutParams() instanceof StaggeredGridLayoutManager.LayoutParams) {

StaggeredGridLayoutManager.LayoutParams params = (StaggeredGridLayoutManager

.LayoutParams) holder

.itemView.getLayoutParams();

params.setFullSpan(true);

}

}

当一个view被创建并添加到window时会调用onViewAttachedToWindow()方法,而在此时,我们做一下判断,

如果是空布局,header,footer,加载中布局,那么将该item设置为跨区域.

这样就不会出现在StaggeredGridLayoutManager中上面的那些布局是只占了一个跨度.说不清楚,看图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果不这样做,那么可能图中的那里标注出来的可能就会是header的效果,而不是跨2格.

设置每个item所占跨度


/**

  • if asFlow is true, footer/header will arrange like normal item view.

  • only works when use {@link GridLayoutManager},and it will ignore span size.

  • 如果asFlow是true的话,那么footer和header就像正常item一样,不会跨区域

  • 默认是false,header和footer都占满屏幕

*/

private boolean headerViewAsFlow, footerViewAsFlow;

/**

  • 设置header不跨区域 就像正常item

  • true:不跨区域 false:跨区域

*/

public void setHeaderViewAsFlow(boolean headerViewAsFlow) {

this.headerViewAsFlow = headerViewAsFlow;

}

public boolean isHeaderViewAsFlow() {

return headerViewAsFlow;

}

/**

  • 设置footer不跨区域 就像正常item

  • true:不跨区域 false:跨区域

*/

public void setFooterViewAsFlow(boolean footerViewAsFlow) {

this.footerViewAsFlow = footerViewAsFlow;

}

public boolean isFooterViewAsFlow() {

return footerViewAsFlow;

}

/**

  • 判断当前type是否是特殊的type

*/

protected boolean isFixedViewType(int type) {

return type == EMPTY_VIEW || type == HEADER_VIEW || type == FOOTER_VIEW || type ==

LOADING_VIEW;

}

/**

  • RecyclerView在开始观察该适配器时调用。

  • 请记住,多个RecyclerView可能会观察到相同的适配器。

  • Adapter与RecyclerView关联起来

  • 这里面主要是做表格布局管理器的头布局和脚布局自占一行的适配

  • @param recyclerView

*/

@Override

public void onAttachedToRecyclerView(final RecyclerView recyclerView) {

super.onAttachedToRecyclerView(recyclerView);

RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();

if (manager instanceof GridLayoutManager) {

final GridLayoutManager gridManager = ((GridLayoutManager) manager);

//设置adapter中每个Item所占用的跨度数

gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

@Override

public int getSpanSize(int position) {

int type = getItemViewType(position);

//如果当前type为header并且asFlow为true:那么header设置为不跨区域,就和正常item一样.只占1格

if (type == HEADER_VIEW && isHeaderViewAsFlow()) {

return 1;

}

if (type == FOOTER_VIEW && isFooterViewAsFlow()) {

return 1;

}

//如果用户没有自定义SpanSizeLookup SpanSizeLookup是用来查询每个item占用的跨度数的实例

if (mSpanSizeLookup == null) {

/*

1.如果是特殊的type,那么item的跨度设置为当前gridManager的SpanCount

即如果我设置的是mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));

那么当前item占2格的跨度

2.如果item不是特殊的item,那么就是占1个格子,不跨

*/

return isFixedViewType(type) ? gridManager.getSpanCount() : 1;

} else {

/*

1.如果是特殊的type,那么item的跨度设置为当前gridManager的SpanCount

即如果我设置的是mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));

那么当前item占2格的跨度

2.如果item不是特殊的item,那么交给外部调用者来处理每个item应该占多少个格

*/

return isFixedViewType(type) ? gridManager.getSpanCount() :

mSpanSizeLookup.getSpanSize(gridManager,

position - getHeaderLayoutCount());

}

}

});

}

}

private SpanSizeLookup mSpanSizeLookup;

/**

用于外部调用者设置每个item的跨度,除了header,footer,emptyView,loadMoreView

*/

public interface SpanSizeLookup {

int getSpanSize(GridLayoutManager gridLayoutManager, int position);

}

/**

  • @param spanSizeLookup instance to be used to query number of spans occupied by each item

用于查询每个item占用的跨度数的实例

*/

public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {

this.mSpanSizeLookup = spanSizeLookup;

}

首先,我们将empty_view,header_view,footer_view,loading_view这些特殊的布局,单独写个方法去判断是否属于特殊的布局.

并且我们设置了2个属性,用于开发者可能会将布局设置为header(footer)和普通item一样都只占1个格子,而不是占满屏幕(占gridManager的SpanCount个格子).

在RecyclerView在开始观察该适配器时调用onAttachedToRecyclerView()方法,然后在里面判断是否是GridLayoutManager,如果是则

设置adapter中每个Item所占用的跨度数.

getSpanSize()逻辑:

- 如果当前type为header或footer并且asFlow为true:那么header或footer设置为不跨区域,就和正常item一样.只占1格.

- 如果用户没有自定义SpanSizeLookup SpanSizeLookup是用来查询每个item占用的跨度数的实例

- 1.如果是特殊的type,那么item的跨度设置为当前gridManager的SpanCount

即如果我设置的是mRecyclerView.setLayoutManager(new GridLayoutManager(this,2));

最后

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题

注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

互联网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

最新“美团+字节+腾讯”一二三面问题,挑战一下你能走到哪一面?

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

网工程师必备的面试1000题

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题

[外链图片转存中…(img-xTobLCR5-1715812765420)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值