数据在数据库中,所以我通常使用CursorAdapter,并使用CursorLoader在ListView上,但现在我需要一个ViewPager而不是一个ListView,并且需要一个PagerAdapter,我只有它看到它的工作
The data is in a Database, so I would normally use CursorAdapter and have it work with CursorLoader on a ListView, however now I need a ViewPager instead of a ListView and that takes a PagerAdapter and I only have it have seen it work with lists.
是否有使用游标的原生传呼机适配器,或者不适合使用。
Is there a native pager adapter that uses a cursor or ill have to make it work?
感谢!
推荐答案基于 CursorAdapter 我有一个实现扩展 FragmentPagerAdapter ,唯一的区别是您将使用来自光标实例化 Fragment 。
Based on the internals of the CursorAdapter I have an implementation that extends FragmentPagerAdapter with the only difference that you will use the information coming from a Cursor to instantiate a Fragment.
package com.example; import android.content.Context; import android.database.Cursor; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.util.SparseIntArray; import android.view.ViewGroup; import java.util.HashMap; public abstract class CursorFragmentPagerAdapter extends FragmentPagerAdapter { protected boolean mDataValid; protected Cursor mCursor; protected Context mContext; protected SparseIntArray mItemPositions; protected HashMap<Object, Integer> mObjectMap; protected int mRowIDColumn; public CursorFragmentPagerAdapter(Context context, FragmentManager fm, Cursor cursor) { super(fm); init(context, cursor); } void init(Context context, Cursor c) { mObjectMap = new HashMap<Object, Integer>(); boolean cursorPresent = c != null; mCursor = c; mDataValid = cursorPresent; mContext = context; mRowIDColumn = cursorPresent ? c.getColumnIndexOrThrow("_id") : -1; } public Cursor getCursor() { return mCursor; } @Override public int getItemPosition(Object object) { Integer rowId = mObjectMap.get(object); if (rowId != null && mItemPositions != null) { return mItemPositions.get(rowId, POSITION_NONE); } return POSITION_NONE; } public void setItemPositions() { mItemPositions = null; if (mDataValid) { int count = mCursor.getCount(); mItemPositions = new SparseIntArray(count); mCursor.moveToPosition(-1); while (mCursor.moveToNext()) { int rowId = mCursor.getInt(mRowIDColumn); int cursorPos = mCursor.getPosition(); mItemPositions.append(rowId, cursorPos); } } } @Override public Fragment getItem(int position) { if (mDataValid) { mCursor.moveToPosition(position); return getItem(mContext, mCursor); } else { return null; } } @Override public void destroyItem(ViewGroup container, int position, Object object) { mObjectMap.remove(object); super.destroyItem(container, position, object); } @Override public Object instantiateItem(ViewGroup container, int position) { if (!mDataValid) { throw new IllegalStateException("this should only be called when the cursor is valid"); } if (!mCursor.moveToPosition(position)) { throw new IllegalStateException("couldn't move cursor to position " + position); } int rowId = mCursor.getInt(mRowIDColumn); Object obj = super.instantiateItem(container, position); mObjectMap.put(obj, Integer.valueOf(rowId)); return obj; } public abstract Fragment getItem(Context context, Cursor cursor); @Override public int getCount() { if (mDataValid) { return mCursor.getCount(); } else { return 0; } } public void changeCursor(Cursor cursor) { Cursor old = swapCursor(cursor); if (old != null) { old.close(); } } public Cursor swapCursor(Cursor newCursor) { if (newCursor == mCursor) { return null; } Cursor oldCursor = mCursor; mCursor = newCursor; if (newCursor != null) { mRowIDColumn = newCursor.getColumnIndexOrThrow("_id"); mDataValid = true; } else { mRowIDColumn = -1; mDataValid = false; } setItemPositions(); notifyDataSetChanged(); return oldCursor; } @Override public long getItemId(int position) { if (!mDataValid || !mCursor.moveToPosition(position)) { return super.getItemId(position); } int rowId = mCursor.getInt(mRowIDColumn); return rowId; } }您可以轻松地根据需要修改代码。
If you need something else than Fragment's you can easily alter the code to your needs.
更多推荐
ViewPager和数据库
发布评论