package by.istin.android.xcore.widget; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.os.Parcelable; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.ViewGroup; import by.istin.android.xcore.utils.CursorUtils; public abstract class ViewPagerCursorAdapter extends PagerAdapter { private Cursor mCursor; private int mCount; private final Context mContext; private final int mResource; private boolean mDataValid = false; public ViewPagerCursorAdapter(Context ctx, Cursor cursor, int resource) { super(); this.mCursor = cursor; this.mContext = ctx; this.mResource = resource; if (cursor != null) { mDataValid = true; mCount = cursor.getCount(); } else { mCount = 0; } } @Override public int getCount() { return mCount; } @Override public Object instantiateItem(ViewGroup container, int position) { final View containerItem = View.inflate(mContext, getResource(position), null); onViewItemCreated(containerItem); Cursor cursor = getItemAtPosition(position); if (cursor != null) { init(containerItem, cursor); } container.addView(containerItem, 0); return containerItem; } protected void onViewItemCreated(View containerItem) { } public Cursor getItemAtPosition(int position) { if (!mDataValid || CursorUtils.isClosed(mCursor)) { return null; } mCursor.moveToPosition(position); return mCursor; } public int getResource(int position) { return mResource; } public abstract void init(View container, Cursor cursor); @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public boolean isViewFromObject(View view, Object object) { return view == (object); } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { } @Override public Parcelable saveState() { return null; } public Cursor swapCursor(Cursor newCursor) { if (newCursor == mCursor) { if (newCursor == null) { mCount = 0; } else { mCount = newCursor.getCount(); } notifyDataSetChanged(); return newCursor; } Cursor oldCursor = mCursor; mCursor = newCursor; if (newCursor != null && !CursorUtils.isClosed(mCursor)) { // notify the observers about the new cursor mDataValid = true; mCount = newCursor.getCount(); notifyDataSetChanged(); } else { mCount = 0; mDataValid = false; notifyDataSetChanged(); } return oldCursor; } }