RecyclerView实用功能(一)粘性头部
前言
Android的日常开发中,RecyclerView绝对是个高频使用的控件,我们也经常碰到各种常见的需求,
比如粘性头部,多级列表等等,这会开一个系列,记录这些有关RecyclerView功能的实现方式。
效果
实现思路
思路很巧妙,也很简单,在RecyclerView外部容器添加一个HeaderView,然后RecyclerView每一个Item
添加相同的HeaderView。第一个Item显示HeaderView,后面的Item根据需求决定Item显示与否。
最关键的操作步骤是,控制外部HeaderView如何显示,当Iiem移动到外部HeaderView下面时,
相应要控制外部HeaderView一起移动,给RecyclerView添加滑动监听即可:
private class ScrollListener extends RecyclerView.OnScrollListener {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
View view = recyclerView.getChildAt(0);
if(view != null && view.getContentDescription() != null) {
stickyHeader.setVisibility(View.VISIBLE);
tvHeader.setText(String.valueOf(view.getContentDescription()));
}
View underView =
recyclerView.findChildViewUnder(stickyHeader.getMeasuredWidth() / 2
, stickyHeader.getMeasuredHeight() + 1);//获取位于头部下方的itemView
if(underView != null && underView.getTag() != null) {
int tag = (int) underView.getTag();
int deltaY = underView.getTop() - stickyHeader.getMeasuredHeight();
if(tag == ItemAdapter.HAS_STICKY_VIEW) {//当该item显示头部
if(underView.getTop() > 0) {//当该item还未移出RecyclerView
stickyHeader.setTranslationY(deltaY); //移动头部
} else {//当Item移出顶部,粘性头部复原
stickyHeader.setTranslationY(0);
}
} else {//当Item不包含粘性头部时
stickyHeader.setTranslationY(0);
}
}
}
}
代码实现
下面给出具体的代码实现方式,项目源码已上传GitHub