android 粘性控件,RecyclerView 粘性标签库: 可结合 BRVAH 使用

一个强大的粘性标签库,实现思路来源于「pinned-section-item-decoration」,感觉有用的话star个呗(^∀^)

功能

大粘性标签支持垂直方向的线性、网格、瀑布流布局管理器

小粘性标签支持垂直方向的线性和网格一行只有一列网格布局管理器

支持标签的单击、双击和长按事件

支持标签内部子控件的单击、双击和长按事件

可以绘制线性、网格、瀑布流布局的分隔线,支持自定义分割线样式(PS:垂直瀑布流布局需要Item高度固定,不能随机变化导致Item位置切换,可参考「MainActivity 97-109行」)

效果图

big_header_linearlayout.gif

big_header_gridlayout.gif

big_header_staggeredgridlayout.gif

small_header_linearlayout.gif

stock_demo.gif

扩展库

它能做什么?

首先在dependencies添加

compile 'com.oushangfeng:PinnedSectionItemDecoration:1.1.1'

RecyclerView的Adapter需要实现PinnedHeaderNotifyer接口,重写方法告诉ItemDecoration哪种类型是粘性标签类型和某个位置粘性标签的信息(用于点击标签事件)「供参考的StockAdapter」

@Override

public boolean isPinnedHeaderType(int viewType) {

return viewType == StockEntity.StockInfo.TYPE_HEADER;

}

@Override

public StockEntity.StockInfo getPinnedHeaderInfo(int position) {

return ((StockEntity.StockInfo) getData().get(position));

}

复制代码

Adapter记得要实现对网格布局和瀑布流布局的标签占满一行的处理,调用FullSpanUtil工具类进行处理

@Override

public void onAttachedToRecyclerView(RecyclerView recyclerView) {

super.onAttachedToRecyclerView(recyclerView);

FullSpanUtil.onAttachedToRecyclerView(recyclerView, this, StockEntity.StockInfo.TYPE_HEADER);

}

@Override

public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {

super.onViewAttachedToWindow(holder);

FullSpanUtil.onViewAttachedToWindow(holder, this, StockEntity.StockInfo.TYPE_DATA);

}

复制代码

实现大粘性标签RecyclerView只需要添加一个PinnedHeaderItemDecoration,由于参数太多,现在只支持使用创建者模式创建,注意大标签所在的最外层布局不能设置marginTop,暂时没想到方法解决

往上滚动遮不住真正的标签「供参考的StockActivity」

final OnHeaderClickAdapter clickAdapter = new OnHeaderClickAdapter() {

@Override

public void onHeaderClick(int id, int position, StockEntity.StockInfo data) {

switch (id) {

case R.id.fl:

// case OnItemTouchListener.HEADER_ID:

Toast.makeText(StockActivity.this, "click, tag: " + data.pinnedHeaderName, Toast.LENGTH_SHORT).show();

break;

case R.id.iv_more:

Toast.makeText(StockActivity.this, "click " + data.pinnedHeaderName + "'s more button", Toast.LENGTH_SHORT).show();

break;

}

}

};

mRecyclerView.addItemDecoration(

new PinnedHeaderItemDecoration.Builder()

// 设置分隔线资源ID

.setDividerId(R.drawable.divider)

// 开启绘制分隔线,默认关闭

.enableDivider(true)

// 通过传入包括标签和其内部的子控件的ID设置其对应的点击事件

.setClickIds(R.id.iv_more)

// 开启标签点击事件(不包括标签里面的子控件),默认开启

.disableHeaderClick(false)

// 设置标签和其内部的子控件的监听,若设置点击监听不为null,并且开启标签的点击监听,那么标签的点击回调返回的id为ItemTouchListener.HEADER_ID

.setHeaderClickListener(clickAdapter)

.create());

复制代码

716147f387109a46a472920334d7bbd5.png

实现小粘性标签稍微复杂点,比如这个是数据的布局A

复制代码

3344fa2144c33289bb080a1afb9992e8.png

这个是带有小标签的布局B

复制代码

c2be002aaaa60a91b14fd929bf8eb054.png

布局B就相当于在原来A的基础上放上个小标签,然后实现小粘性标签RecyclerView只需要添加一个SmallPinnedHeaderItemDecoration,只支持使用创建者模式创建,注意标签不能设置marginTop,

因为往上滚动遮不住真正的标签「供参考的SecondActivity」

OnHeaderClickAdapter> headerClickAdapter = new OnHeaderClickAdapter>() {

@Override

public void onHeaderClick(int id, int position, PinnedHeaderEntity data) {

if (id == R.id.iv_small_pinned_header) {

Toast.makeText(SecondActivity.this, "click tag: " + data.getPinnedHeaderName(), Toast.LENGTH_SHORT).show();

}

}

};

mRecyclerView.addItemDecoration(

// 构造方法需要传入小标签的ID

new SmallPinnedHeaderItemDecoration.Builder>(R.id.tv_small_pinned_header)

// 开启绘制分隔线,默认关闭

.enableDivider(true)

// 设置分隔线资源ID

.setDividerId(R.drawable.divider)

// 关闭标签点击事件(不包括标签里面的子控件)

.disableHeaderClick(true)

// 通过传入包括标签和其内部的子控件的ID设置其对应的点击事件

// 这里我虽然关闭了标签点击事件,但是又传入了标签的ID,所以点击事件仍旧会发生

.setClickIds(R.id.tv_small_pinned_header)

// 设置标签和其内部的子控件的监听,若设置点击监听不为null,并且开启标签的点击监听,那么标签的点击回调返回的id为ItemTouchListener.HEADER_ID

.setHeaderClickListener(headerClickAdapter)

.create());

复制代码

后续

解决不能设置marginTop的问题

解决设置marginBottom位置不对的问题

License

Copyright 2016 oubowu

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

复制代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值