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