- Add the Codota plugin to your IDE and get smart completions
private void myMethod () {}
@Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildAdapterPosition(view); IndexStickyViewAdapter adapter = (IndexStickyViewAdapter)parent.getAdapter(); IndexStickyEntity entity = adapter.getItem(position); if(entity.getItemType() != ItemType.ITEM_TYPE_INDEX && position < (adapter.getItemCount() - 1) && adapter.getItem(position + 1).getItemType() != ItemType.ITEM_TYPE_INDEX) { outRect.set(0, 0, 0, mSize); } }
/** * 刷新数据列表 * @param count */ private void refresh(int count) { transferOriginalData(); addAllIndexHeaderAdapterData(); addAllIndexFooterAdapterData(count); IndexValueBus.getInstance().notifyDataSetChanged(mIndexValueList); notifyDataSetChanged(); }
/** * 添加底部自定义索引数据适配器 * @param adapter */ public void addIndexFooterAdapter(IndexHeaderFooterAdapter adapter) { if(mAdapter == null) { throw new NullPointerException("IndexStickyViewAdapter is null, please set IndexStickyViewAdapter first"); } mAdapter.addIndexFooterAdapter(adapter); }
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); if(viewType == ItemType.ITEM_TYPE_INDEX) {//IndexSticky索引类型视图 onBindIndexViewHolder(holder, position, getItem(position).getIndexName()); } else if(viewType == ItemType.ITEM_TYPE_CONTENT) {//IndexSticky索引类型视图正常Item内容视图 onBindContentViewHolder(holder, position, getItem(position).getOriginalData()); } else if(mIndexHeaderAdapters.indexOfKey(viewType) >= 0) {//自定义的头部视图 mIndexHeaderAdapters.get(viewType).onBindViewHolder(holder, position, getItem(position).getOriginalData()); } else if(mIndexFooterAdapters.indexOfKey(viewType) >= 0) {//自定义的Footer视图 mIndexFooterAdapters.get(viewType).onBindViewHolder(holder, position, getItem(position).getOriginalData()); } else { throw new IllegalStateException("don't support viewType:" + viewType); } }
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder viewHolder; if(viewType == ItemType.ITEM_TYPE_INDEX) {//IndexSticky索引类型视图 viewHolder = onCreateIndexViewHolder(parent); } else if(viewType == ItemType.ITEM_TYPE_CONTENT) {//IndexSticky索引类型视图正常Item内容视图 viewHolder = onCreateContentViewHolder(parent); } else if(mIndexHeaderAdapters.indexOfKey(viewType) >= 0) {//自定义的头部视图 viewHolder = mIndexHeaderAdapters.get(viewType).onCreateViewHolder(parent); } else if(mIndexFooterAdapters.indexOfKey(viewType) >= 0) {//自定义的Footer视图 viewHolder = mIndexFooterAdapters.get(viewType).onCreateViewHolder(parent); } else { throw new IllegalStateException("don't support viewType:" + viewType); } addListener(viewHolder, viewType); return viewHolder; }
/**------------ 设置Footer自定义索引数据项适配器 -------------------------**/ public void addIndexFooterAdapter(IndexHeaderFooterAdapter<T> indexFooterAdapter) { if(indexFooterAdapter == null) { return; } indexFooterAdapter.transfer(ItemType.ITEM_TYPE_INDEX_FOOTER + mIndexFooterAdapters.size()); mIndexFooterAdapters.put(indexFooterAdapter.getItemType(), indexFooterAdapter); if(!TextUtils.isEmpty(indexFooterAdapter.getIndexValue())) { mIndexValueList.add(indexFooterAdapter.getIndexValue()); mIndexValuePositionMap.put(indexFooterAdapter.getIndexValue(), getItemCount()); mIndexFooterValueList.add(indexFooterAdapter.getIndexValue()); mIndexFooterValuePositionMap.put(indexFooterAdapter.getIndexValue(), getItemCount()); } mIndexFooterList.addAll(indexFooterAdapter.getEntityList()); notifyDataSetChanged(); }
@Override public int getItemViewType(int position) { return getItem(position).getItemType(); }
/** * 添加头部自定义索引数据适配器 * @param adapter */ public void addIndexHeaderAdapter(IndexHeaderFooterAdapter adapter) { if(mAdapter == null) { throw new NullPointerException("IndexStickyViewAdapter is null, please set IndexStickyViewAdapter first"); } mAdapter.addIndexHeaderAdapter(adapter); }
/** * 根据SideBar中每个索引值获取该索引值在{@link RecyclerView} 中的位置 * @param touchPosition * @return */ private int getScrollPositionBySideBarSelectPosition(int touchPosition) { String indexValue = mSideBar.getIndexValue(touchPosition); return mAdapter.getIndexValuePosition(indexValue); }
public void setAdapter(IndexStickyViewAdapter adapter) { mAdapter = adapter; initStickyHeaderView(); mSideBar.setData(adapter.getIndexValueList()); mRecyclerView.setAdapter(adapter); IndexValueBus.getInstance().clear(); IndexValueBus.getInstance().addObserver(this); }
@Override public void onClick(View v) { int position = viewHolder.getAdapterPosition(); IndexStickyEntity<T> entity = getItem(position); if(viewType == ItemType.ITEM_TYPE_CONTENT) {//IndexSticky索引类型视图正常Item内容视图 if(mOnItemClickListener != null) { mOnItemClickListener.onItemClick(viewHolder.itemView, position, entity.getOriginalData()); } } else if(mIndexHeaderAdapters.indexOfKey(viewType) >= 0) {//自定义的头部视图 IndexHeaderFooterAdapter<T> adapter = mIndexHeaderAdapters.get(viewType); if(adapter.getOnItemClickListener() != null) { adapter.getOnItemClickListener().onItemClick(viewHolder.itemView, position, entity.getOriginalData()); } } else if(mIndexFooterAdapters.indexOfKey(viewType) >= 0) {//自定义的Footer视图 IndexHeaderFooterAdapter<T> adapter = mIndexFooterAdapters.get(viewType); if(adapter.getOnItemClickListener() != null) { adapter.getOnItemClickListener().onItemClick(viewHolder.itemView, position, entity.getOriginalData()); } } } });
@Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); int top; int bottom; int left = parent.getPaddingLeft() + mLeftMargin; int right = parent.getWidth() - parent.getPaddingRight() - mRightMargin; final int childCount = parent.getChildCount(); IndexStickyViewAdapter adapter = (IndexStickyViewAdapter)parent.getAdapter(); IndexStickyEntity entity; for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); int position = parent.getChildAdapterPosition(child); entity = adapter.getItem(position); if(entity.getItemType() != ItemType.ITEM_TYPE_INDEX && position < (adapter.getItemCount() - 1) && adapter.getItem(position + 1).getItemType() != ItemType.ITEM_TYPE_INDEX) { //获得child的布局信息 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams)child.getLayoutParams(); top = child.getBottom() + params.bottomMargin; bottom = top + mSize; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } }
@Override public boolean onLongClick(View v) { int position = viewHolder.getAdapterPosition(); IndexStickyEntity<T> entity = getItem(position); if(viewType == ItemType.ITEM_TYPE_CONTENT) {//IndexSticky索引类型视图正常Item内容视图 if(mOnItemLongClickListener != null) { mOnItemLongClickListener.onItemLongClick(viewHolder.itemView, position, entity.getOriginalData()); } } else if(mIndexHeaderAdapters.indexOfKey(viewType) >= 0) {//自定义的头部视图 IndexHeaderFooterAdapter<T> adapter = mIndexHeaderAdapters.get(viewType); if(adapter.getOnItemLongClickListener() != null) { adapter.getOnItemLongClickListener().onItemLongClick(viewHolder.itemView, position, entity.getOriginalData()); } } else if(mIndexFooterAdapters.indexOfKey(viewType) >= 0) {//自定义的Footer视图 IndexHeaderFooterAdapter<T> adapter = mIndexFooterAdapters.get(viewType); if(adapter.getOnItemLongClickListener() != null) { adapter.getOnItemLongClickListener().onItemLongClick(viewHolder.itemView, position, entity.getOriginalData()); } } return false; } });
if(firstVisiblePosition < 0 || firstVisiblePosition >= mAdapter.getItemCount()) { return; IndexStickyEntity entity = mAdapter.getItem(firstVisiblePosition); mSideBar.setSelectPosition(mSideBar.getPosition(entity.getIndexValue())); if(TextUtils.isEmpty(entity.getIndexName()) && mStickyHeaderView.itemView.getVisibility() == VISIBLE) { if(firstVisiblePosition + 1 >= mAdapter.getItemCount()) { return; IndexStickyEntity secondVisibleEntity = mAdapter.getItem(firstVisiblePosition + 1); if(secondVisibleEntity.getItemType() == ItemType.ITEM_TYPE_INDEX) {