目前实现title吸顶主要是2中思路:
1.ListView
2.RecyclerView
下面逐一介绍。
1.ListView
ListView的方案主要是用于就项目改造,因为新项目早就用Rv了
项目现状:ListView的item中都有title,近期改版中需要将title打造成吸顶的效果,
由于项目已久,界面中逻辑较多,而且又是UI改版,就没有重新写
思路:
RelativeLayout中嵌套ListView和一个TextView,TextView的高度与item中的title高度一致
然后监听ListView的滑动并在合适的时机修改TextView的Y值,以达到滑动的视觉效果
ListView:部分代码
private void updateHoverTitleView() {
if (timeTitleTv == null) {
return;
}
if (dayPickerView == null || dayPickerView.getChildCount() <= 1) {
timeTitleTv.setVisibility(View.GONE);
return;
}
View c = dayPickerView.getChildAt(0);
if (c == null) {
timeTitleTv.setVisibility(View.GONE);
return;
}
//更新title
View monthViewInLv = c.findViewById(R.id.tv_month);
if (monthViewInLv instanceof TextView) {
String s = ((TextView) monthViewInLv).getText().toString();
timeTitleTv.setText(s);
}
View secondChildView = dayPickerView.getChildAt(1);
if (secondChildView != null) {
if (secondChildView.getTop() <= timeTitleTvHeight) {
timeTitleTv.setY(-(timeTitleTvHeight - secondChildView.getTop()));
} else {
timeTitleTv.setY(0);
}
}
}
2.RecyclerView
Rv主要就是自定义ItemDecoration
关键方法是onDrawOver&getItemOffsets
RecyclerView:部分代码
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
final int itemCount = state.getItemCount();
final int childCount = parent.getChildCount();
final int top = parent.getTop() + parent.getPaddingTop();
String preMonthName; //标记上一个item对应的Month
String currentMonthName = null; //当前item对应的Month
for (int i = 0; i < childCount; i++) {
View view = parent.getChildAt(i);
int position = parent.getChildAdapterPosition(view);
preMonthName = currentMonthName;
currentMonthName = getMonthValue(position);
if (currentMonthName == null || TextUtils.equals(currentMonthName, preMonthName))
continue;
int viewRight = view.getRight();
float left = Math.max(mWidth, view.getLeft());//left 决定当前左侧第一个悬浮Group的位置
if (position + 1 < itemCount) {
//获取下个GroupName
String nextGroupName = getMonthValue(position + 1);
//下一组的第一个View接近头部
if (!currentMonthName.equals(nextGroupName) && viewRight < left) {
left = viewRight;
}
}
//根据left绘制month
int parentBottom = parent.getBottom();
c.drawRect(left - mWidth, top, left, parentBottom, mPaint);
int index = currentMonthName.indexOf("月");
String monthNum = currentMonthName.substring(0, index);
String month = currentMonthName.substring(index, currentMonthName.length());
c.drawText(monthNum, left - mWidth + 30, (parentBottom - top) / 2 - 10, mTextPaint);
c.drawText(month, left - mWidth + 30, (parentBottom - top) / 2 + 30, mTextPaint);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int childAdapterPosition = parent.getChildAdapterPosition(view);
String monthValue = getMonthValue(childAdapterPosition);
if (TextUtils.isEmpty(monthValue)) {
return;
}
if (childAdapterPosition == 0 || isMonthShouldSticky(childAdapterPosition)) {
outRect.left = mWidth;
}
}
网友评论