This library provides you a functionality of joining together several adapters and layouts into a single RecyclerView. The result of joining will be an adapter, which you can set to your RecyclerView. Actually, this library allows you to construct multitype adapter from separate parts (such as an adapters and layouts). This approach gives you next advantages:
- More flixibility of using adapters (they also can be used separately or in different constructions)
- You can dynamically change your RecyclerView structure by adding and removing parts programmatically
- Add header, footer, or devider layout without adding a new item type to your adapter
For example, you can combine two adapters and use title layout to separate them, like in full demo app:
Get started app source code
Configure dependencies in you module build.gradle file. Example
dependencies {
//your other dependencies
compile 'su.j2e:rv-joiner:1.0.9'//latest version by now
}
NOTE: You need to use jCenter repositiory to do this (example).
See releases for new versions.
We need RecyclerView. Not surprising. Example
You need just your RecyclerView.Adapter, nothing special (except of getting your view or view holder position, see Cautions section). Example
You can join your layout to recycler view. Just a usual xml layout, no magic. Example
Usage example from get started source:
//init your RecyclerView as usual
RecyclerView rv = (RecyclerView) findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(this));
//construct a joiner
RvJoiner rvJoiner = new RvJoiner();
rvJoiner.add(new JoinableLayout(R.layout.header));
rvJoiner.add(new JoinableAdapter(new MyAdapter()));
rvJoiner.add(new JoinableLayout(R.layout.devider));
rvJoiner.add(new JoinableAdapter(new MyAdapter()));
rvJoiner.add(new JoinableLayout(R.layout.footer));
//set join adapter to your RecyclerView
rv.setAdapter(rvJoiner.getAdapter());
Thats it! Result looks like this:
That's only the basic usage. Check full demo app and read Extra customization section to learn how to bring more customization into your app with joiner.
Be careful when using these methods of RecyclerView:
and these methods of RecyclerView.ViewHolder
returns JOINED position and JOINED type. I've named joined values the values, which were assigned to items after joining. Joined adapter has item positions from 0 to sum of joined adapter sizes and unique type id for every real type in joined adapters. But often we need real position of view or view holder in adapter (for ex. when reacting on click). To get real position (real type and other info) for joined position you can use RvJoiner.getPositionInfo(joinedPosition). Also it can be useful to hide this dependency in a wrapper class (to avoid code modifications if decide to use this adapter without joiner). I wrote RvJoiner.RealPositionProvider for you. You can see usage example in full demo app.
Good news: you can use getItemId() for ViewHolder and getChildItemId(View child) for RecyclerView, this methods works as expected (or not as expected, if you forget to support stable ids).
If you want to setHasStableIds(true) in your adapter, do this in constructor of your adapter, or use JoinableAdapter constructor to achieve this. If you set it in other time, you will get an error, because RvJoiner adds data observers to your adapter.
Also don't forget to set has stable ids for joined adapter in RvJoiner constructor (it's the only way to do this). And the last thing: don't forget to support stable ids in all joined adapters (otherwise, unpredictable behaviour can occurs).
I'm working on this topic and more detailed description, but all examples already ready and works. Check Full Demo App source. I hope it helps.
Library is distributed under Apache 2.0 license, see LICENSE.txt
Enjoy!