• Stars
    star
    101
  • Rank 338,166 (Top 7 %)
  • Language
    Java
  • License
    Apache License 2.0
  • Created over 9 years ago
  • Updated almost 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Collection of tools for RecyclerView. Includes headers, sections, pull to refresh, etc

RecyclerViewTools

Collection of tools for RecyclerView. Download

This collection was developed with two main goals: easy to code (very simple API) & robust (it really works). Includes:

  • Headers, Footers & Sections for RecyclerView. Based on a common "wrap" adapter.
  • Extended SwipeRefreshLayout to use when Recycler is not direct child (e.g. on CoordinatorLayout)
  • Implementation of OnItemClickListener for RecyclerView (works standalone or in conjunction with headers, footers & sections).
  • FastScrollToTop function.

Usage

Seriously couldn't be simpler:

Add to Gradle build script the lib

dependencies {

    ... your other dependencies

    compile 'com.eyeem.recyclerviewtools:library:{latest}'
}

Headers & Footers

// create your recycler adapter normally, then wrap it on the wrapper
adapter = new Adapter();
WrapAdapter wrapAdapter = new WrapAdapter(adapter);
// add headers & footers
wrapAdapter.addHeader(header = inflater.inflate(R.layout.overlay_background, recycler, false));
wrapAdapter.addHeader(inflater.inflate(R.layout.header, recycler, false));
wrapAdapter.addFooter(inflater.inflate(R.layout.footer, recycler, false));

Sections

pass a AbstractSectionAdapter when creating the wrap adapter. The section adapter API is mirrored from RecyclerView (onCreateViewHolder and onBindViewHolder). Feel free to extend from the SimpleSectionAdapter.

SimpleSectionAdapter sections =
    new SimpleSectionAdapter(
        new int[]{0, 6, 9, 14, 19, 23}) { // those are the section positions

    // override here onCreateSectionViewHolder and onBindSectionView
    
}
WrapAdapter wrapAdapter = new WrapAdapter(adapter, sections);

Notify data changed

Just call from the original adapter, internally the calls get offset to the proper positions

adapter.notifyItemRangeInserted(start, count); // that's your original adapter

ScrollListeners

// callback to this activity when recycler is at the end (needs to load more)
recycler.addOnScrollListener(new LoadMoreOnScrollListener(this));

// auto call Picasso.pauseTag and resumeTag for smooth scrolling with ImageViews
recycler.addOnScrollListener(new PicassoOnScrollListener(PICASSO_TAG));

OnItemClickListener

If using a WrapAdapter you can just pass to a normal setter, or for RecyclerView.Adapter just call .setOnClickListener(detector); during onCreateViewHolder on every View.

position and id get automatically offset, to exclude header, footer and section clicks.

wrapAdapter.setOnItemClickListenerDetector(
 new OnItemClickListenerDetector(
  recycler, // recycler view
   new OnItemClickListenerDetector.OnItemClickListener() { // the detector
    @Override public void onItemClick(RecyclerView parent, View view, int position, long id, RecyclerView.ViewHolder viewHolder) { // the callback
     // code here ...
    }
   }));

Using with GridLayoutManager

Auto generate or wrap the SpanSizeLookup. Default uses 1 span per item. Header, footer and sections take the whole spanCount.

gridLayoutManager.setSpanSizeLookup(
  wrapAdapter.createSpanSizeLookup(spanCount)); // auto-generate SpanSizeLookup

Caveats

the methods notifyItem* from RecyclerView.Adapter were made final by Google. So it is impossible to override them on the WrapAdapter to properly adjust their positions before passing to the super class.

So, DO NOT use any notify method from WrapAdapter. Just call from the original adapter.