Android RecyclerView懸浮頂部

RecyclerView懸浮頂部

利用RecyclerView.ItemDecoration實現(xiàn)的懸浮效果

getItemOffsets:通過Rect為每個Item設置偏移,用于繪制Decoration。
onDraw:通過該方法,在Canvas上繪制內容,在繪制Item之前調用。(如果沒有通過getItemOffsets設置偏移的話,Item的內容會將其覆蓋)
onDrawOver:通過該方法,在Canvas上繪制內容,在Item之后調用。(畫的內容會覆蓋在item的上層)

RecyclerView rv_list = (RecyclerView) findViewById(R.id.rv_list);
        rv_list.setLayoutManager(new LinearLayoutManager(this));
        CityAdapter cityAdapter = new CityAdapter(list);
        rv_list.setAdapter(cityAdapter);
        rv_list.addItemDecoration(new StickyItemDecoration(new StickyItemDecoration.OnTagListener() {
            @Override
            public String getGroupName(int position) {
                return list.get(position).getPinyin().substring(0, 1);
            }

            @Override
            public boolean isGroupFirst(int position) {
                return position == 0 || !TextUtils.equals(list.get(position).getPinyin().substring(0, 1), list.get(position - 1).getPinyin().substring(0, 1));
            }
        }));
public class StickyItemDecoration extends RecyclerView.ItemDecoration {

    private int decorationHeight = 100;
    private OnTagListener onTagListener;
    private final Paint bgPaint;
    private final Paint textPaint;

    public StickyItemDecoration(OnTagListener onTagListener) {
        this.onTagListener = onTagListener;
        bgPaint = new Paint();
        bgPaint.setAntiAlias(true);
        bgPaint.setColor(Color.parseColor("#3F51B5"));
        textPaint = new Paint();
        textPaint.setAntiAlias(true);
        textPaint.setColor(Color.parseColor("#ffffff"));
        textPaint.setTextSize(45);
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        int itemCount = state.getItemCount();
        int childCount = parent.getChildCount();
        int left = parent.getLeft() + parent.getPaddingLeft();
        int right = parent.getRight() + parent.getPaddingRight();
        int viewLeft;
        String currentTag = null;
        for (int i = 0; i < childCount; i++) {
            View childView = parent.getChildAt(i);
            viewLeft = childView.getLeft() + childView.getPaddingLeft();
            int position = parent.getChildAdapterPosition(childView);
            if (TextUtils.equals(currentTag, onTagListener.getGroupName(position))) {
                continue;
            }
            currentTag = onTagListener.getGroupName(position);
            int viewBottom = childView.getBottom();
            int top = Math.max(decorationHeight, childView.getTop());
            if (position + 1 < itemCount) {
                if (!TextUtils.equals(currentTag, onTagListener.getGroupName(position + 1)) && viewBottom < top) {
                    top = viewBottom;
                }
            }
            c.drawRect(left, top - decorationHeight, right, top, bgPaint);
            Paint.FontMetrics fontMetrics = textPaint.getFontMetrics();
            float baseLine = top - (decorationHeight - (fontMetrics.bottom - fontMetrics.top)) / 2 - fontMetrics.bottom;
            c.drawText(currentTag.toUpperCase(), viewLeft, baseLine, textPaint);
        }
    }

    @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 (position == 0 || onTagListener.isGroupFirst(position)) {
            outRect.top = decorationHeight;
        }
    }

    public interface OnTagListener {
        String getGroupName(int position);

        boolean isGroupFirst(int position);
    }
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容