package com.afollestad.silk.adapters; import android.content.Context; import android.database.Cursor; import com.afollestad.silk.caching.SilkComparable; import com.afollestad.silk.caching.SilkCursorItem; import java.lang.reflect.Method; /** * A CursorAdapter wrapper that makes creating list adapters easier. Contains various convenience methods and handles * recycling views on its own. * * @param <ItemType> The type of items held in the adapter. * @author Aidan Follestad (afollestad) */ public abstract class SilkCursorAdapter<ItemType extends SilkCursorItem & SilkComparable> extends SilkAdapter<ItemType> implements ScrollStatePersister { private final Class<? extends SilkCursorItem> mClass; public SilkCursorAdapter(Context context, Class<? extends SilkCursorItem> cls) { super(context); mClass = cls; } public static Object performConvert(Cursor cursor, Class<? extends SilkCursorItem> type) { try { Object o = type.newInstance(); Method m = type.getDeclaredMethod("convert", Cursor.class); return m.invoke(o, cursor); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("An error occurred while invoking convert() of class " + type.getName() + ": " + e.getMessage()); } } public final void changeCursor(Cursor cursor) { clear(); if (cursor != null) { while (cursor.moveToNext()) { ItemType item = (ItemType) performConvert(cursor, mClass); if (item != null) add(item); } } } }