BaseCursorPagerAdapter.java revision 0c18e5deef5209d21b527a01feb6b789715eb48e
1f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein/* 2f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Copyright (C) 2011 Google Inc. 3f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Licensed to The Android Open Source Project. 4f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 5f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 6f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * you may not use this file except in compliance with the License. 7f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * You may obtain a copy of the License at 8f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 9f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 10f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 11f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software 12f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 13f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * See the License for the specific language governing permissions and 15f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * limitations under the License. 16f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 17f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 18f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinpackage com.android.ex.photo.adapters; 19f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 20f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.Fragment; 21f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.app.FragmentManager; 22f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.content.Context; 23f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.database.Cursor; 24f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.util.Log; 25f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.util.SparseIntArray; 26f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport android.view.View; 27f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 28f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport com.android.ex.photo.provider.PhotoContract; 29f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 30f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinimport java.util.HashMap; 31f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 32f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein/** 33f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Page adapter for use with an BaseCursorLoader. Unlike other cursor adapters, this has no 34f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * observers for automatic refresh. Instead, it depends upon external mechanisms to provide 35f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * the update signal. 36f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 37f77a7eb196d16110c7b1087352b423913821ff61Andrew Sappersteinpublic abstract class BaseCursorPagerAdapter extends BaseFragmentPagerAdapter { 38f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private static final String TAG = "BaseCursorPagerAdapter"; 39f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 40f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein Context mContext; 41f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private boolean mDataValid; 42f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private Cursor mCursor; 43f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private int mRowIDColumn; 44f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** Mapping of row ID to cursor position */ 45f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private SparseIntArray mItemPosition; 46f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** Mapping of instantiated object to row ID */ 47f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private HashMap<Object, Integer> mObjectRowMap = new HashMap<Object, Integer>(); 48f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 49f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 50f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Constructor that always enables auto-requery. 51f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 52f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @param c The cursor from which to get the data. 53f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @param context The context 54f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 55f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public BaseCursorPagerAdapter(Context context, FragmentManager fm, Cursor c) { 56f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein super(fm); 57f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein init(context, c); 58f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 59f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 60f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 61f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Makes a fragment for the data pointed to by the cursor 62f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 63f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @param context Interface to application's global information 64f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @param cursor The cursor from which to get the data. The cursor is already 65f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * moved to the correct position. 66f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @return the newly created fragment. 67f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 680c18e5deef5209d21b527a01feb6b789715eb48eAndrew Sapperstein public abstract Fragment getItem(Context context, Cursor cursor, int position); 69f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 70f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein @Override 71f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public Fragment getItem(int position) { 72f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (mDataValid && moveCursorTo(position)) { 730c18e5deef5209d21b527a01feb6b789715eb48eAndrew Sapperstein return getItem(mContext, mCursor, position); 74f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 75f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return null; 76f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 77f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 78f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein @Override 79f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public int getCount() { 80f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (mDataValid && mCursor != null) { 81f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return mCursor.getCount(); 82f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } else { 83f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return 0; 84f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 85f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 86f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 87f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein @Override 88f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public Object instantiateItem(View container, int position) { 89f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (!mDataValid) { 90f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein throw new IllegalStateException("this should only be called when the cursor is valid"); 91f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 92f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 93f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein final Integer rowId; 94f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (moveCursorTo(position)) { 95f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein rowId = mCursor.getString(mRowIDColumn).hashCode(); 96f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } else { 97f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein rowId = null; 98f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 99f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 100f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein // Create the fragment and bind cursor data 101f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein final Object obj = super.instantiateItem(container, position); 102f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (obj != null) { 103f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mObjectRowMap.put(obj, rowId); 104f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 105f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return obj; 106f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 107f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 108f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein @Override 109f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public void destroyItem(View container, int position, Object object) { 110f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mObjectRowMap.remove(object); 111f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 112f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein super.destroyItem(container, position, object); 113f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 114f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 115f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein @Override 116f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public int getItemPosition(Object object) { 117f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein final Integer rowId = mObjectRowMap.get(object); 118f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (rowId == null || mItemPosition == null) { 119f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return POSITION_NONE; 120f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 121f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 122f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein final int position = mItemPosition.get(rowId, POSITION_NONE); 123f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return position; 124f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 125f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 126f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 127f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @return true if data is valid 128f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 129f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public boolean isDataValid() { 130f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return mDataValid; 131f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 132f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 133f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 134f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Returns the cursor. 135f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 136f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public Cursor getCursor() { 137f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return mCursor; 138f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 139f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 140f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 141f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Returns the data item associated with the specified position in the data set. 142f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 143f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public Object getDataItem(int position) { 144f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (mDataValid && moveCursorTo(position)) { 145f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return mCursor; 146f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } else { 147f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return null; 148f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 149f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 150f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 151f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 152f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Returns the row id associated with the specified position in the list. 153f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 154f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public long getItemId(int position) { 155f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (mDataValid && moveCursorTo(position)) { 156f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return mCursor.getString(mRowIDColumn).hashCode(); 157f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } else { 158f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return 0; 159f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 160f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 161f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 162f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 163f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Swap in a new Cursor, returning the old Cursor. 164f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 165f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @param newCursor The new cursor to be used. 166f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @return Returns the previously set Cursor, or null if there was not one. 167f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * If the given new Cursor is the same instance is the previously set 168f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Cursor, null is also returned. 169f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 170f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public Cursor swapCursor(Cursor newCursor) { 171f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (Log.isLoggable(TAG, Log.VERBOSE)) { 172f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein Log.v(TAG, "swapCursor old=" + (mCursor == null ? -1 : mCursor.getCount()) + 173f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein "; new=" + (newCursor == null ? -1 : newCursor.getCount())); 174f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 175f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 176f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (newCursor == mCursor) { 177f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return null; 178f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 179f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein Cursor oldCursor = mCursor; 180f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mCursor = newCursor; 181f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (newCursor != null) { 182f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mRowIDColumn = newCursor.getColumnIndex(PhotoContract.PhotoViewColumns.URI); 183f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mDataValid = true; 184f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } else { 185f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mRowIDColumn = -1; 186f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mDataValid = false; 187f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 188f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 189f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein setItemPosition(); 190f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein notifyDataSetChanged(); // notify the observers about the new cursor 191f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return oldCursor; 192f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 193f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 194f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 195f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Converts the cursor into a CharSequence. Subclasses should override this 196f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * method to convert their results. The default implementation returns an 197f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * empty String for null values or the default String representation of 198f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * the value. 199f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 200f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @param cursor the cursor to convert to a CharSequence 201f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @return a CharSequence representing the value 202f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 203f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein public CharSequence convertToString(Cursor cursor) { 204f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return cursor == null ? "" : cursor.toString(); 205f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 206f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 207f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein @Override 208f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein protected String makeFragmentName(int viewId, int index) { 209f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (moveCursorTo(index)) { 210f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return "android:pager:" + viewId + ":" + mCursor.getString(mRowIDColumn).hashCode(); 211f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } else { 212f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return super.makeFragmentName(viewId, index); 213f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 214f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 215f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 216f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 217f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Moves the cursor to the given position 218f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * 219f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * @return {@code true} if the cursor's position was set. Otherwise, {@code false}. 220f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 221f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private boolean moveCursorTo(int position) { 222f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (mCursor != null && !mCursor.isClosed()) { 223f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return mCursor.moveToPosition(position); 224f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 225f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return false; 226f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 227f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 228f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 229f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Initialize the adapter. 230f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 231f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private void init(Context context, Cursor c) { 232f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein boolean cursorPresent = c != null; 233f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mCursor = c; 234f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mDataValid = cursorPresent; 235f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mContext = context; 236f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mRowIDColumn = cursorPresent 237f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein ? mCursor.getColumnIndex(PhotoContract.PhotoViewColumns.URI) : -1; 238f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 239f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 240f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein /** 241f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * Sets the {@link #mItemPosition} instance variable with the current mapping of 242f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein * row id to cursor position. 243f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein */ 244f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein private void setItemPosition() { 245f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein if (!mDataValid || mCursor == null || mCursor.isClosed()) { 246f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mItemPosition = null; 247f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein return; 248f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 249f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 250f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein SparseIntArray itemPosition = new SparseIntArray(mCursor.getCount()); 251f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 252f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mCursor.moveToPosition(-1); 253f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein while (mCursor.moveToNext()) { 254f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein final int rowId = mCursor.getString(mRowIDColumn).hashCode(); 255f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein final int position = mCursor.getPosition(); 256f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein 257f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein itemPosition.append(rowId, position); 258f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 259f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein mItemPosition = itemPosition; 260f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein } 261f77a7eb196d16110c7b1087352b423913821ff61Andrew Sapperstein} 262