1package android.support.v17.leanback.widget;
2
3import android.util.SparseArray;
4
5/**
6 * An {@link ObjectAdapter} implemented with a {@link android.util.SparseArray}.
7 * This class maintains an array of objects where each object is associated
8 * with an integer key which determines its order relative to other objects.
9 */
10public class SparseArrayObjectAdapter extends ObjectAdapter {
11    private SparseArray<Object> mItems = new SparseArray<Object>();
12
13    /**
14     * Constructs an adapter with the given {@link PresenterSelector}.
15     */
16    public SparseArrayObjectAdapter(PresenterSelector presenterSelector) {
17        super(presenterSelector);
18    }
19
20    /**
21     * Constructs an adapter with the given {@link Presenter}.
22     */
23    public SparseArrayObjectAdapter(Presenter presenter) {
24        super(presenter);
25    }
26
27    /**
28     * Constructs an adapter.
29     */
30    public SparseArrayObjectAdapter() {
31        super();
32    }
33
34    @Override
35    public int size() {
36        return mItems.size();
37    }
38
39    @Override
40    public Object get(int position) {
41        return mItems.valueAt(position);
42    }
43
44    /**
45     * Returns the index for the given item in the adapter.
46     *
47     * @param item  The item to find in the array.
48     * @return Index of the item, or a negative value if not found.
49     */
50    public int indexOf(Object item) {
51        return mItems.indexOfValue(item);
52    }
53
54    /**
55     * Returns the index for the given key in the adapter.
56     *
57     * @param key The key to find in the array.
58     * @return Index of the item, or a negative value if not found.
59     */
60    public int indexOf(int key) {
61        return mItems.indexOfKey(key);
62    }
63
64    /**
65     * Notify that the content of a range of items changed. Note that this is
66     * not same as items being added or removed.
67     *
68     * @param positionStart The position of first item that has changed.
69     * @param itemCount The count of how many items have changed.
70     */
71    public void notifyArrayItemRangeChanged(int positionStart, int itemCount) {
72        notifyItemRangeChanged(positionStart, itemCount);
73    }
74
75    /**
76     * Sets the item for the given key.
77     *
78     * @param key The key associated with the item.
79     * @param item The item associated with the key.
80     */
81    public void set(int key, Object item) {
82        int index = mItems.indexOfKey(key);
83        if (index >= 0) {
84            if (mItems.valueAt(index) != item) {
85                mItems.setValueAt(index, item);
86                notifyItemRangeChanged(index, 1);
87            }
88        } else {
89            mItems.append(key, item);
90            index = mItems.indexOfKey(key);
91            notifyItemRangeInserted(index, 1);
92        }
93    }
94
95    /**
96     * Clears the given key and associated item from the adapter.
97     *
98     * @param key The key to be cleared.
99     */
100    public void clear(int key) {
101        int index = mItems.indexOfKey(key);
102        if (index >= 0) {
103            mItems.removeAt(index);
104            notifyItemRangeRemoved(index, 1);
105        }
106    }
107
108    /**
109     * Removes all items from this adapter, leaving it empty.
110     */
111    public void clear() {
112        final int itemCount = mItems.size();
113        if (itemCount == 0) {
114            return;
115        }
116        mItems.clear();
117        notifyItemRangeRemoved(0, itemCount);
118    }
119
120    /**
121     * Returns the object for the given key, or null if no mapping for that key exists.
122     */
123    public Object lookup(int key) {
124        return mItems.get(key);
125    }
126}