2012-10-04 12 views
6

I dati sono in un database, quindi normalmente utilizzo CursorAdapter e lo faccio funzionare con CursorLoader su un ListView, tuttavia ora ho bisogno di un ViewPager invece di un ListView e che accetta un PagerAdapter e l'ho avuto solo visto che funziona con le liste.ViewPager e Database

C'è un adattatore per cercapersone nativo che utilizza un cursore o malato per farlo funzionare?

Grazie!

+0

Ho fatto in modo che funzionasse, ma stranamente il mio OnLoadFinished non viene chiamato quando viene effettuata una query diversa, ma viene chiamato quando l'attività inizia, omg. – urSus

risposta

9

Sulla base dei meccanismi interni della CursorAdapter ho un'implementazione che si estende FragmentPagerAdapter con l'unica differenza che si intende utilizzare le informazioni provenienti da una Cursor creare un'istanza di un 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; 
    } 

} 

Se avete bisogno di qualcosa di diverso frammento di si può facilmente modificare il codice alle proprie esigenze.

Problemi correlati