Fun with RecyclerView

22
©2015 GlobalLogic Inc. CONFIDENTIAL

Transcript of Fun with RecyclerView

©2015 GlobalLogic Inc. CONFIDENTIAL

©2015 GlobalLogic Inc. CONFIDENTIAL

RecyclerView

CONFIDENTIAL©2015 GlobalLogic Inc.

ListView vs LinearLayout

CONFIDENTIAL

ListView vs LinearLayoutLinearLayout 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.LayoutManagerInsert 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!