public class SectionedGridRecyclerViewAdapter extends RecyclerView.Adapter {    private final Context mContext;    private static final int SECTION_TYPE = 0;    private boolean mValid = true;    private int mSectionResourceId;    private int mTextResourceId;    private LayoutInflater mLayoutInflater;    private RecyclerView.Adapter mBaseAdapter;    private SparseArray
mSections = new SparseArray
(); private RecyclerView mRecyclerView; public SectionedGridRecyclerViewAdapter(Context context, int sectionResourceId, int textResourceId,RecyclerView recyclerView, RecyclerView.Adapter baseAdapter) { mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mSectionResourceId = sectionResourceId; mTextResourceId = textResourceId; mBaseAdapter = baseAdapter; mContext = context; mRecyclerView = recyclerView; mBaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { @Override public void onChanged() { mValid = mBaseAdapter.getItemCount()>0; notifyDataSetChanged(); } @Override public void onItemRangeChanged(int positionStart, int itemCount) { mValid = mBaseAdapter.getItemCount()>0; notifyItemRangeChanged(positionStart, itemCount); } @Override public void onItemRangeInserted(int positionStart, int itemCount) { mValid = mBaseAdapter.getItemCount()>0; notifyItemRangeInserted(positionStart, itemCount); } @Override public void onItemRangeRemoved(int positionStart, int itemCount) { mValid = mBaseAdapter.getItemCount()>0; notifyItemRangeRemoved(positionStart, itemCount); } }); final GridLayoutManager layoutManager = (GridLayoutManager)(mRecyclerView.getLayoutManager()); layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return (isSectionHeaderPosition(position))? layoutManager.getSpanCount() : 1 ; } }); } public static class SectionViewHolder extends RecyclerView.ViewHolder { public TextView title; public SectionViewHolder(View view, int mTextResourceid) { super(view); title = (TextView) view.findViewById(mTextResourceid); } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int typeView) { if (typeView == SECTION_TYPE) { final View view = LayoutInflater.from(mContext).inflate(mSectionResourceId, parent, false); return new SectionViewHolder(view,mTextResourceId); }else{ return mBaseAdapter.onCreateViewHolder(parent, typeView -1); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder sectionViewHolder, int position) { if (isSectionHeaderPosition(position)) { ((SectionViewHolder)sectionViewHolder).title.setText(mSections.get(position).title); }else{ mBaseAdapter.onBindViewHolder(sectionViewHolder,sectionedPositionToPosition(position)); } } @Override public int getItemViewType(int position) { return isSectionHeaderPosition(position) ? SECTION_TYPE : mBaseAdapter.getItemViewType(sectionedPositionToPosition(position)) +1 ; } public static class Section { int firstPosition; int sectionedPosition; CharSequence title; public Section(int firstPosition, CharSequence title) { this.firstPosition = firstPosition; this.title = title; } public CharSequence getTitle() { return title; } } public void setSections(Section[] sections) { mSections.clear(); Arrays.sort(sections, new Comparator
() { @Override public int compare(Section o, Section o1) { return (o.firstPosition == o1.firstPosition) ? 0 : ((o.firstPosition < o1.firstPosition) ? -1 : 1); } }); int offset = 0; // offset positions for the headers we're adding for (Section section : sections) { section.sectionedPosition = section.firstPosition + offset; mSections.append(section.sectionedPosition, section); ++offset; } notifyDataSetChanged(); } public int positionToSectionedPosition(int position) { int offset = 0; for (int i = 0; i < mSections.size(); i++) { if (mSections.valueAt(i).firstPosition > position) { break; } ++offset; } return position + offset; } public int sectionedPositionToPosition(int sectionedPosition) { if (isSectionHeaderPosition(sectionedPosition)) { return RecyclerView.NO_POSITION; } int offset = 0; for (int i = 0; i < mSections.size(); i++) { if (mSections.valueAt(i).sectionedPosition > sectionedPosition) { break; } --offset; } return sectionedPosition + offset; } public boolean isSectionHeaderPosition(int position) { return mSections.get(position) != null; } @Override public long getItemId(int position) { return isSectionHeaderPosition(position) ? Integer.MAX_VALUE - mSections.indexOfKey(position) : mBaseAdapter.getItemId(sectionedPositionToPosition(position)); } @Override public int getItemCount() { return (mValid ? mBaseAdapter.getItemCount() + mSections.size() : 0); }}

绑定适配器
在RecyclerView执行完setLayoutManager()方法后

      List.Section> sections = new ArrayList.Section>();        sections.add(new SectionedGridRecyclerViewAdapter.Section(**X**, "**标题**"));        sections.add(new SectionedGridRecyclerViewAdapter.Section(**Y**, "**标题**"));        SectionedGridRecyclerViewAdapter.Section[] dummy = new SectionedGridRecyclerViewAdapter.Section[sections.size()];        SectionedGridRecyclerViewAdapter mSectionedAdapter = new                SectionedGridRecyclerViewAdapter(getActivity(), **标题的布局**, **标题的Id**, **RecyclerView对象**, **RecyclerView的适配器**);        mSectionedAdapter.setSections(sections.toArray(dummy));

X:第一个标题出现在第几个Item的位置
Y:第二个标题出现在第几个Item的位置
当然RecyclerView的Item足够多的时候,标题也可以继续添加

更多相关文章

  1. android动态使用FrameLayout(简单使用)
  2. Android(安卓)EditText 银行卡四位空一格
  3. Android(安卓)TextView 一些字体颜色、大小设置属性
  4. Kotlin简单开发-RecyclerView
  5. android GridView的应用举例
  6. Qt for Android程序沉浸式启动页面(去除标题栏、去除黑屏、保留后
  7. 在android的spinner中,实现取VALUE值和TEXT值
  8. Android范例编程一:获取地理位置
  9. Android(安卓)Studio实现简单的购物商城界面

随机推荐

  1. android 开发之动画Activity
  2. Android模拟器常用操作
  3. pAdTy_-5 保存数据
  4. cocos2dx 安卓电量,网络信号获取(android
  5. android 设置为壁纸代码
  6. 个人Code整理
  7. android之getApplicationContext
  8. eclipse运行错误提示 Failed to load D:
  9. Android(安卓)Activity生命周期以及Fragm
  10. 使用Android(安卓)AsyncTask异步线程