public override void OnItemsAdded(RecyclerView recyclerView, int positionStart, int itemCount) { _adapterChangeType = AdapterChangeType.Added; _deferredLayout.Enqueue((recycler, state) => { var viewByAdaptorPositionCopy = _viewByAdaptorPosition.ToArray(); _viewByAdaptorPosition.Clear(); foreach (KeyValuePair <int, AndroidView> pair in viewByAdaptorPositionCopy) { var view = pair.Value; var position = pair.Key; // position unchanged if (position < positionStart) { _viewByAdaptorPosition[position] = view; } // position changed else { _viewByAdaptorPosition[position + itemCount] = view; } } if (_positionOrigin >= positionStart) { _positionOrigin += itemCount; } }); base.OnItemsAdded(recyclerView, positionStart, itemCount); }
public override void OnItemsChanged(RecyclerView recyclerView) { _adapterChangeType = AdapterChangeType.Changed; // low-fidelity change event; assume everything has changed. If adapter reports it has "stable IDs" then // RecyclerView will attempt to synthesize high-fidelity change events: added, removed, moved, updated. Reset(0); RemoveAllViews(); }
void ScrollBy(ref IntVector delta, Recycler recycler, State state) { _adapterChangeType = default(AdapterChangeType); delta = Viewport.BoundTranslation( delta: delta, bound: _virtualLayout.GetBounds(_positionOrigin, state) ); _locationOffset += delta; _samples.Insert(0, delta); _samples.RemoveAt(_samples.Count - 1); OffsetChildren(delta); OnLayoutChildren(recycler, state); }
public override void OnItemsUpdated(RecyclerView recyclerView, int positionStart, int itemCount) { _adapterChangeType = AdapterChangeType.Updated; // rebind rendered updated elements _deferredLayout.Enqueue((recycler, state) => { for (var i = 0; i < itemCount; i++) { var position = positionStart + i; AndroidView view; if (!_viewByAdaptorPosition.TryGetValue(position, out view)) { continue; } recycler.BindViewToPosition(view, position); } }); base.OnItemsUpdated(recyclerView, positionStart, itemCount); }
public override void OnItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) { Assert(itemCount == MaxItemsRemoved); _adapterChangeType = AdapterChangeType.Removed; var positionEnd = positionStart + itemCount; _deferredLayout.Enqueue((recycler, state) => { if (state.ItemCount == 0) { throw new InvalidOperationException("Cannot delete all items."); } // re-map views to their new positions var viewByAdaptorPositionCopy = _viewByAdaptorPosition.ToArray(); _viewByAdaptorPosition.Clear(); foreach (var pair in viewByAdaptorPositionCopy) { var view = pair.Value; var position = pair.Key; // position unchanged if (position < positionStart) { _viewByAdaptorPosition[position] = view; } // position changed else if (position >= positionEnd) { _viewByAdaptorPosition[position - itemCount] = view; } // removed else { _viewByAdaptorPosition[-1] = view; if (_visibleAdapterPosition.Contains(position)) { _visibleAdapterPosition.Remove(position); } } } // if removed origin then shift origin to first removed position if (_positionOrigin >= positionStart && _positionOrigin < positionEnd) { _positionOrigin = positionStart; // if no items to right of removed origin then set origin to item prior to removed set if (_positionOrigin >= state.ItemCount) { _positionOrigin = state.ItemCount - 1; if (!_viewByAdaptorPosition.ContainsKey(_positionOrigin)) { throw new InvalidOperationException( "VirtualLayoutManager must add items to the left and right of the origin" ); } } } // if removed before origin then shift origin left else if (_positionOrigin >= positionEnd) { _positionOrigin -= itemCount; } }); base.OnItemsRemoved(recyclerView, positionStart, itemCount); }
public override void OnItemsMoved(RecyclerView recyclerView, int from, int toValue, int itemCount) { _adapterChangeType = AdapterChangeType.Moved; base.OnItemsMoved(recyclerView, from, toValue, itemCount); }