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}