效果图如下: 代码大体结构 RecyclerView LinearLayoutManager RecyclerView.Adapter
自定义 StickyHeadContainer OnStickyChangeListener StickyItemDecoration
布局如下:
顶部可滚动核心代码如下
StickyHeadContainer
。。。
public void scrollChild(int offset) {
if (mLastOffset != offset) {
mOffset = offset;
ViewCompat.offsetTopAndBottom(getChildAt(0), mOffset - mLastOffset);
}
mLastOffset = mOffset;
}
public int getChildHeight() {
return getChildAt(0).getHeight();
}
public void onDataChange(int stickyHeadPosition) {
if (mDataCallback != null && mLastStickyHeadPosition != stickyHeadPosition) {
mDataCallback.onDataChange(stickyHeadPosition);
}
if (null == mDataCallback) {
Log.w(TAG, "mDataCallback is null");
}
mLastStickyHeadPosition = stickyHeadPosition;
}
。。。
使用
StockActivity#initView()
。。。
final StickyHeadContainer container = (StickyHeadContainer) findViewById(R.id.shc);
final TextView tvStockName = (TextView) container.findViewById(R.id.tv_stock_name);
final CheckBox checkBox = (CheckBox) container.findViewById(R.id.checkbox);
final TextView tvMore = (TextView) container.findViewById(R.id.tv_stock_more);
final ImageView more = (ImageView) container.findViewById(R.id.iv_more);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
。。。
}
});
container.setDataCallback(new StickyHeadContainer.DataCallback() {
@Override
public void onDataChange(int pos) {
mStickyPosition = pos;
StockEntity.StockInfo item = mAdapter.getData().get(pos).getData();
tvStockName.setText(item.stickyHeadName);
checkBox.setChecked(item.check);
}
});
more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
。。。
}
});
container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
。。。
}
});
mRecyclerView = findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(StockActivity.this, LinearLayoutManager.VERTICAL, false));
StickyItemDecoration stickyItemDecoration = new StickyItemDecoration(container, RecyclerViewAdapter.TYPE_STICKY_HEAD);
stickyItemDecoration.setOnStickyChangeListener(new OnStickyChangeListener() {
@Override
public void onScrollable(int offset) {
container.scrollChild(offset);
container.setVisibility(View.VISIBLE);
}
@Override
public void onInVisible() {
container.reset();
container.setVisibility(View.INVISIBLE);
}
});
mRecyclerView.addItemDecoration(stickyItemDecoration);
mRecyclerView.addItemDecoration(new SpaceItemDecoration(mRecyclerView.getContext()));
mAdapter = new StockAdapter(null);
mAdapter.setItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(View view, StockEntity.StockInfo data, int position) {
if(data.getItemType() == RecyclerViewAdapter.TYPE_DATA) {
Toast.makeText(StockActivity.this, "点击了TYPE_DATA Item", Toast.LENGTH_SHORT).show();
}else if(data.getItemType() == RecyclerViewAdapter.TYPE_STICKY_HEAD){
Toast.makeText(StockActivity.this, "点击了TYPE_STICKY_HEAD Item", Toast.LENGTH_SHORT).show();
}
}
});
。。。
RecyclerViewAdapter
。。。
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
FullSpanUtil.onAttachedToRecyclerView(recyclerView, this, TYPE_STICKY_HEAD);
}
@Override
public void onViewAttachedToWindow(RecyclerViewHolder holder) {
FullSpanUtil.onViewAttachedToWindow(holder, this, TYPE_STICKY_HEAD);
}
。。。
(亲测)如果不设置 mDataCallback 则不显示头部悬浮吸顶
一定要进行下面的初始化设置
container.setDataCallback(new StickyHeadContainer.DataCallback() {
@Override
public void onDataChange(int pos) {
mStickyPosition = pos;
StockEntity.StockInfo item = mAdapter.getData().get(pos).getData();
tvStockName.setText(item.stickyHeadName);
checkBox.setChecked(item.check);
}
});
原因如下: StickyHeadContainer# onDataChange(int stickyHeadPosition)
public void onDataChange(int stickyHeadPosition) {
if (mDataCallback != null && mLastStickyHeadPosition != stickyHeadPosition) {
mDataCallback.onDataChange(stickyHeadPosition);
}
if (null == mDataCallback) {
Log.w(TAG, "mDataCallback is null");
}
mLastStickyHeadPosition = stickyHeadPosition;
}
公开源码不渣
https://gitee.com/lc951/my-android 粘性头部可点击
参考https://github.com/Mcflag/ExpandStickyRecyclerVIew
-------------------------------------------------------------------------------100个经典UI设计模板