(请关注新写的一个更优秀的方案StickyItemDecoration)html
一个强大的粘性标签库,实现思路来源于「pinned-section-item-decoration」,感受有用的话star个呗(^∀^)java
BaseRecyclerViewAdapterHelper(强烈推荐使用此适配器,可大大减小工做量。当前demo使用的是v2.9.42。)android
首先在dependencies添加git
若是使用AndroidX库请依赖 compile 'com.oushangfeng:PinnedSectionItemDecoration:1.3.2-androidx' 不然 compile 'com.oushangfeng:PinnedSectionItemDecoration:1.3.2'
Adapter记得要实现对网格布局和瀑布流布局的标签占满一行的处理,调用FullSpanUtil工具类进行处理github
@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_HEADER); }
实现大粘性标签RecyclerView只须要添加一个PinnedHeaderItemDecoration,因为参数太多,如今只支持使用建立者模式建立,注意大标签所在的最外层布局不能设置marginTop,暂时没想到方法解决 往上滚动遮不住真正的标签「供参考的StockActivity」app
OnHeaderClickAdapter clickAdapter = new OnHeaderClickAdapter() { @Override public void onHeaderClick(View view, int id, int position) { switch (id) { case R.id.fl: // case OnItemTouchListener.HEADER_ID: Toast.makeText(StockActivity.this, "click, tag: " + mAdapter.getData().get(position).pinnedHeaderName, Toast.LENGTH_SHORT).show(); break; case R.id.iv_more: Toast.makeText(StockActivity.this, "click " + mAdapter.getData().get(position).pinnedHeaderName + "'s more button", Toast.LENGTH_SHORT) .show(); break; case R.id.checkbox: final CheckBox checkBox = (CheckBox) view; checkBox.setChecked(!checkBox.isChecked()); // 刷新ItemDecorations,致使重绘刷新头部 mRecyclerView.invalidateItemDecorations(); mAdapter.getData().get(position).check = checkBox.isChecked(); mAdapter.notifyItemChanged(position + mHeaderItemDecoration.getDataPositionOffset()); break; } } }; mRecyclerView.addItemDecoration( // 设置粘性标签对应的类型 new PinnedHeaderItemDecoration.Builder(StockEntity.StockInfo.TYPE_HEADER) // 设置分隔线资源ID .setDividerId(R.drawable.divider) // 开启绘制分隔线,默认关闭 .enableDivider(true) // 经过传入包括标签和其内部的子控件的ID设置其对应的点击事件 .setClickIds(R.id.iv_more) // 是否关闭标签点击事件,默认开启 .disableHeaderClick(false) // 设置标签和其内部的子控件的监听,若设置点击监听不为null,可是disableHeaderClick(true)的话,仍是不会响应点击事件 .setHeaderClickListener(clickAdapter) .create());
实现小粘性标签稍微复杂点,好比这个是数据的布局Aide
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#70E593"> <ImageView android:id="@+id/iv_animal" android:layout_gravity="center" android:layout_width="match_parent" android:layout_height="120dp" tools:src="@mipmap/panda0"/> <TextView android:id="@+id/tv_pos" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="8dp" android:textColor="#000000" android:textSize="18dp" tools:text="1"/> </FrameLayout>
这个是带有小标签的布局B工具
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_animal" android:layout_width="match_parent" android:layout_height="120dp" android:background="#70E593" tools:src="@mipmap/panda0"/> <ImageView android:id="@+id/iv_small_pinned_header" android:layout_width="50dp" android:layout_height="50dp" android:background="#5A5A5A" android:padding="8dp" android:textColor="#ffffff" android:textSize="18dp" tools:src="@mipmap/panda0" tools:text="熊猫"/> </FrameLayout>
布局B就至关于在原来A的基础上放上个小标签,而后实现小粘性标签RecyclerView只须要添加一个SmallPinnedHeaderItemDecoration,只支持使用建立者模式建立,注意标签不能设置marginTop, 由于往上滚动遮不住真正的标签「供参考的SecondActivity」布局
OnHeaderClickAdapter headerClickAdapter = new OnHeaderClickAdapter() { @Override public void onHeaderClick(View view, int id, int position) { if (id == R.id.iv_small_pinned_header) { Toast.makeText(SecondActivity.this, "click tag: " + mAdapter.getData().get(position).getPinnedHeaderName(), Toast.LENGTH_SHORT).show(); } } }; mRecyclerView.addItemDecoration( // 构造方法须要传入小标签的ID和粘性标签对应的类型 new SmallPinnedHeaderItemDecoration.Builder(R.id.tv_small_pinned_header,BaseHeaderAdapter.TYPE_HEADER) // 开启绘制分隔线,默认关闭 .enableDivider(true) // 设置分隔线资源ID .setDividerId(R.drawable.divider) // 经过传入包括标签和其内部的子控件的ID设置其对应的点击事件 .setClickIds(R.id.iv_small_pinned_header) // 是否关闭标签点击事件,默认开启 .disableHeaderClick(true) // 设置标签和其内部的子控件的监听,若设置点击监听不为null,可是disableHeaderClick(true)的话,仍是不会响应点击事件 .setHeaderClickListener(clickAdapter) .create());
开源地址:https://github.com/oubowu/PinnedSectionItemDecoration/blob/master/README-CN.mdui