/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android; import java.util.HashMap; import android.content.Context; import android.database.Cursor; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.util.Log; import android.util.SparseIntArray; import android.view.View; import com.galaxy.meetup.client.android.ui.fragments.EsFragmentPagerAdapter; import com.galaxy.meetup.client.util.EsLog; /** * * @author sihai * */ public abstract class EsCursorPagerAdapter extends EsFragmentPagerAdapter { Context mContext; private Cursor mCursor; private boolean mDataValid; private SparseIntArray mItemPosition; private HashMap mObjectRowMap; private int mRowIDColumn; public EsCursorPagerAdapter(Context context, FragmentManager fragmentmanager, Cursor cursor) { super(fragmentmanager); mObjectRowMap = new HashMap(); boolean flag; int i; if(cursor != null) flag = true; else flag = false; mCursor = cursor; mDataValid = flag; mContext = context; if(flag) i = cursor.getColumnIndexOrThrow("_id"); else i = -1; mRowIDColumn = i; } private boolean moveCursorTo(int i) { boolean flag; if(mCursor != null && !mCursor.isClosed()) flag = mCursor.moveToPosition(i); else flag = false; return flag; } private void setItemPosition() { if(!mDataValid || mCursor == null || mCursor.isClosed()) { mItemPosition = null; } else { SparseIntArray sparseintarray = new SparseIntArray(mCursor.getCount()); mCursor.moveToPosition(-1); for(; mCursor.moveToNext(); sparseintarray.append(mCursor.getInt(mRowIDColumn), mCursor.getPosition())); mItemPosition = sparseintarray; } } public final void destroyItem(View view, int i, Object obj) { mObjectRowMap.remove(obj); super.destroyItem(view, i, obj); } public int getCount() { int i; if(mDataValid && mCursor != null) i = mCursor.getCount(); else i = 0; return i; } public final Cursor getCursor() { return mCursor; } public Fragment getItem(int i) { Fragment fragment; if(mDataValid && moveCursorTo(i)) { Context _tmp = mContext; fragment = getItem(mCursor); } else { fragment = null; } return fragment; } public abstract Fragment getItem(Cursor cursor); public final int getItemPosition(Object obj) { int i = -2; Integer integer = (Integer)mObjectRowMap.get(obj); if(integer != null && mItemPosition != null) i = mItemPosition.get(integer.intValue(), i); return i; } public final Object instantiateItem(View view, int i) { if(!mDataValid) throw new IllegalStateException("this should only be called when the cursor is valid"); Integer integer; Object obj; if(moveCursorTo(i)) integer = Integer.valueOf(mCursor.getInt(mRowIDColumn)); else integer = null; obj = super.instantiateItem(view, i); if(obj != null) mObjectRowMap.put(obj, integer); return obj; } public final boolean isDataValid() { return mDataValid; } protected final String makeFragmentName(int i, int j) { String s; if(moveCursorTo(j)) s = (new StringBuilder("android:espager:")).append(i).append(":").append(mCursor.getInt(mRowIDColumn)).toString(); else s = super.makeFragmentName(i, j); return s; } public final Cursor swapCursor(Cursor cursor) { Cursor cursor1; if(EsLog.isLoggable("EsCursorPagerAdapter", 2)) { StringBuilder stringbuilder = new StringBuilder("swapCursor old="); int i; StringBuilder stringbuilder1; int j; if(mCursor == null) i = -1; else i = mCursor.getCount(); stringbuilder1 = stringbuilder.append(i).append("; new="); if(cursor == null) j = -1; else j = cursor.getCount(); Log.v("EsCursorPagerAdapter", stringbuilder1.append(j).toString()); } if(cursor == mCursor) { cursor1 = null; } else { cursor1 = mCursor; mCursor = cursor; if(cursor != null) { mRowIDColumn = cursor.getColumnIndexOrThrow("_id"); mDataValid = true; } else { mRowIDColumn = -1; mDataValid = false; } setItemPosition(); notifyDataSetChanged(); } return cursor1; } }