package com.example.dq.app_itemdecoration;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.text.TextPaint;
import android.text.TextUtils;
import android.view.View;
/**
* Created by DQ on 2017/8/7
* 城市列表的分割線, 主要用于繪制字母分組
*/
public class CityItemDecoration extends RecyclerView.ItemDecoration {
private int mGroupHeight = 60;
private int mSideMargin = 10;
private Paint mGroupPaint;
private TextPaint mTextPaint;
private GroupListener mListener;
public CityItemDecoration(Context context, GroupListener pListener) {
mGroupPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mGroupPaint.setColor(context.getResources().getColor(android.R.color.holo_blue_dark));
mListener = pListener;
mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTextSize(40);
mTextPaint.setColor(Color.WHITE);
mTextPaint.setTextAlign(Paint.Align.LEFT);
}
// 偏移距離嚼隘,可以變相的理解成欧宜,分割線的高度
@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int position = parent.getChildAdapterPosition(view);
// 不是省份
if (mListener == null || TextUtils.isEmpty(mListener.getGroupName(position))) {
return;
}
// 是否顯示 省份標簽
if (isFirstInGroup(position)) {
outRect.top = mGroupHeight;
}
}
@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 left = parent.getLeft() + parent.getPaddingLeft();
final int right = parent.getRight() + parent.getPaddingRight();
String preGroupName; // 標記上一個item的省份
String currentGroupName = null; // 當前item的省份
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
int position = parent.getChildAdapterPosition(child);
preGroupName = currentGroupName;
currentGroupName = mListener.getGroupName(position);
// 普通城市 or 和上一次省份相同
if (TextUtils.equals(currentGroupName, preGroupName)) {
continue;
}
// 計算高度
int bottom = Math.max(mGroupHeight, child.getTop());
if (position < itemCount - 1) {
String nextGroupName = mListener.getGroupName(position + 1);
int viewBottom = child.getBottom();
if (!currentGroupName.equals(nextGroupName) && viewBottom < bottom) {
bottom = viewBottom;
}
}
// 接下來, 就是省份的繪制了
c.drawRect(left, bottom - mGroupHeight, right, bottom, mGroupPaint);
// 繪制文字
Paint.FontMetrics fm = mTextPaint.getFontMetrics();
float baseline = bottom - (mGroupHeight - (fm.bottom - fm.top)) / 2 - fm.bottom;
// TODO: 2017/8/7 DQ: 這里添加的是左右邊距础废,是可以自己設置的
float textWidth = mTextPaint.measureText(currentGroupName);
float marginLeft = true ? 0 : right - textWidth;
mSideMargin = Math.abs(mSideMargin);
mSideMargin = true ? mSideMargin : -mSideMargin;
c.drawText(currentGroupName, left + mSideMargin + marginLeft, baseline, mTextPaint);
}
}
public interface GroupListener {
String getGroupName(int position);
}
private boolean isFirstInGroup(int position) {
if (position == 0) {
return true;
} else {
String prevGroupId = mListener.getGroupName(position - 1);
String groupId = mListener.getGroupName(position);
return !TextUtils.equals(prevGroupId, groupId);
}
}
}
[Android] 零碎知識匯總 - RecyclerView 頂部懸浮
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來担敌,“玉大人摔敛,你說我怎么就攤上這事∪猓” “怎么了马昙?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長刹悴。 經(jīng)常有香客問我行楞,道長,這世上最難降的妖魔是什么土匀? 我笑而不...
- 正文 為了忘掉前任子房,我火速辦了婚禮,結果婚禮上恒削,老公的妹妹穿的比我還像新娘池颈。我一直安慰自己,他們只是感情好钓丰,可當我...
- 文/花漫 我一把揭開白布躯砰。 她就那樣靜靜地躺著,像睡著了一般携丁。 火紅的嫁衣襯著肌膚如雪琢歇。 梳的紋絲不亂的頭發(fā)上兰怠,一...
- 文/蒼蘭香墨 我猛地睜開眼宠互,長吁一口氣:“原來是場噩夢啊……” “哼味榛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起予跌,我...
- 正文 年R本政府宣布当娱,位于F島的核電站吃既,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏跨细。R本人自食惡果不足惜鹦倚,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冀惭。 院中可真熱鬧震叙,春花似錦、人聲如沸散休。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽戚丸。三九已至划址,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夺颤。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 用這個方式實現(xiàn)有很大的局限性, 粗糙的解釋一下, 在recyclerView上套一層和itemView 上一樣的h...
- 之前的項目中有需要開發(fā)一個懸浮置頂?shù)男Ч裉炜吹揭黄恼赂Ш悖彩侵v到這么一個效果咱台,但是實現(xiàn)方法不同,明顯比自己的更...
- 利用RecyclerView.ItemDecoration實現(xiàn)的懸浮效果 getItemOffsets:通過Rec...
- 上圖: 本文代碼的Github地址 思路: 每一個RecyclerView的item的布局(下文叫itemUI...
- 12月5日下午俭驮,機關七支部全體黨員及入黨積極分子參加了以“憲法宣傳活動”為主題的主題黨日活動回溺。此次活動特邀...