コード例 #1
0
        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);
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
 public override void OnItemsMoved(RecyclerView recyclerView, int from, int toValue, int itemCount)
 {
     _adapterChangeType = AdapterChangeType.Moved;
     base.OnItemsMoved(recyclerView, from, toValue, itemCount);
 }