©2015 GlobalLogic Inc. CONFIDENTIAL
©2015 GlobalLogic Inc. CONFIDENTIAL
RecyclerView
CONFIDENTIAL
Agenda
1. ListView vs LinearLayout
2. Adapter
3. ItemDecoration
4. ItemAnimator
5. LayoutManager
6. Q&A
CONFIDENTIAL©2015 GlobalLogic Inc.
ListView vs LinearLayout
CONFIDENTIAL
ListView vs LinearLayout
LinearLayout ListView
CONFIDENTIAL©2015 GlobalLogic Inc.
Adapter
CONFIDENTIAL
RecyclerView.Adapter<ViewHolder>
@Override
public int getItemCount() {
return mData.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_layout, viewGroup, false);
// initializing view’s listeners
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.update(mData.get(position));
}
CONFIDENTIAL©2015 GlobalLogic Inc.
ItemDecoration
CONFIDENTIAL
RecyclerView.ItemDecoration
Item #2
Item #1
Item #2
Item #1
Item #2
Item #1
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
// drawing under the views
}
@Override
public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
// drawing over the views
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
// adding extra paddings to the view
}
CONFIDENTIAL©2015 GlobalLogic Inc.
ItemAnimator
CONFIDENTIAL
RecyclerView.ItemAnimator
● DefaultItemAnimator
● Call notifyItemXXXX() instead of notifyDataSetInvalidated()
● Custom ItemAnimator
CONFIDENTIAL
RecyclerView.ItemAnimator
Custom ItemAnimator:
● animateXXXX()
● runPendingAnimations()
● endAnimation(), endAnimations()
*do not forget to call dispatchXXXFinished()
CONFIDENTIAL
RecyclerView.ItemAnimator
public boolean animateAdd(final ViewHolder holder) {
endAnimation(holder);
mPendingAdditions.add(holder);
return true;
}
public void runPendingAnimations() {
...
if (!mPendingAdditions.isEmpty()) {
final ArrayList<ViewHolder> additions = new ArrayList<ViewHolder>();
additions.addAll(mPendingAdditions);
mAdditionsList.add(additions);
mPendingAdditions.clear();
for (ViewHolder holder : additions) {
animateAddImpl(holder);
}
additions.clear();
mAdditionsList.remove(additions);
}
}
CONFIDENTIAL©2015 GlobalLogic Inc.
LayoutManager
CONFIDENTIAL
RecyclerView.LayoutManager
Predefined LayoutManagers:
● LinearLayoutManager: horizontal and vertical
● StaggeredGridLayoutManager
● GridLayoutManager
● Custom LayoutManager
CONFIDENTIAL
RecyclerView.LayoutManager
Custom LayoutManager:
● generateDefaultLayoutParams()
● onLayoutChildren()
● canScrollHorizontally() & canScrollVertically()
● scrollHorizontallyBy() & scrollVerticallyBy()
● offsetChildrenHorizontal() & offsetChildrenVertical()
● layoutDecorated(), getDecoratedXXXX()
CONFIDENTIAL
RecyclerView.LayoutManager
A BB C D E
Remove item animation:
A C D E F
CONFIDENTIAL
RecyclerView.LayoutManager
● supportsPredictiveItemAnimations()
● onLayoutChildren()
● RecyclerView.State.isPreLayout()
● LayoutParams.isItemRemoved()
Remove item animation:
A B C D E FA FC D E
CONFIDENTIAL
RecyclerView.LayoutManager
Insert item animation:
A B C D EA B C DX
CONFIDENTIAL
RecyclerView.LayoutManager
● getScrapList()
● addDisappearingView() instead of addView()
Insert item animation:
A B C D EA EB C DX
CONFIDENTIAL©2015 GlobalLogic Inc.
Q&A
CONFIDENTIAL©2015 GlobalLogic Inc.
Alexander Kravchenko
Thank You!

Fun with RecyclerView