I am using ActiveAndroid ORM and UltimateRecyclerView in an Android app. I do not know how to display data in a list using these popular libraries. I know the data is stored correctly in the database. Using the following method, I get the cursor to the data I want to display.
public Cursor eventsCursor() {
String query = new Select()
.from(Event.class)
.orderBy("time")
.toSql();
return ActiveAndroid.getDatabase().rawQuery(query, null);
}
I wrote my implementation RecyclerView.Adapter<VH>( EventCursorRecyclerAdapter), compatible with the UltimateViewAdapter, which contains a CursorAdapter member for working with the database (the code is based on this solution ). ActiveAndroid does not have ContentObservers ( issue # 3 ), so I register an observer on the ContentProvider during initialization. Initialization looks like this:
Fragment Class
protected UltimateRecyclerView listView;
private AbstractCursorRecyclerAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
cursor = eventsCursor();
cursor.setNotificationUri(getActivity().getContentResolver(),
ContentProvider.createUri(Event.class, null));
adapter = new EventCursorRecyclerAdapter(getActivity(), cursor, R.layout.list_item_event);
getActivity().getSupportLoaderManager().initLoader(0, savedInstanceState, this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
listView.setLayoutManager(new LinearLayoutManager(getActivity()));
listView.setAdapter(adapter);
}
ContentProvider ActiveAndroid (docs) URI CursorLoader:
AndroidManifest.xml
<application ...>
<provider
android:name="com.activeandroid.content.ContentProvider"
android:authorities="com.activeandroid.content.ContentProvider"
android:exported="false" />
...
</application>
LoaderManager.LoaderCallbacks<T>
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle cursor) {
return new CursorLoader(
MyFragment.this.getActivity(),
ContentProvider.createUri(Event.class, null),
null, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.asCursorAdapter().changeCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.asCursorAdapter().changeCursor(null);
}
,
MyFragment.this.getActivity().getContentResolver().notifyChange(
ContentProvider.createUri(Event.class, modifiedId), null);
, . , .
UPDATE ( ).
EventCursorAdapter
public class EventCursorAdapter extends CursorAdapter {
private final int itemLayoutId;
private final LayoutInflater inflater;
public EventCursorAdapter(Context context, Cursor cursor, @LayoutRes int itemLayoutId) {
super(context, cursor, 0);
this.itemLayoutId = itemLayoutId;
this.inflater = LayoutInflater.from(context);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return inflater.inflate(itemLayoutId, parent, false);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
EventItemViewHolder holder = (EventItemViewHolder) view.getTag();
holder.tvName.setText(cursor.getString(holder.nameIndex));
}
}
EventCursorRecyclerAdapter
public final class EventCursorRecyclerAdapter extends AbstractCursorRecyclerAdapter {
public EventCursorRecyclerAdapter(Context context, Cursor cursor, @LayoutRes int itemLayoutId) {
super(new EventCursorAdapter(context, cursor, itemLayoutId), context);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
cursorAdapter.bindView(holder.itemView, context, cursorAdapter.getCursor());
}
@Override
public UltimateRecyclerviewViewHolder onCreateViewHolder(ViewGroup parent) {
View v = cursorAdapter.newView(context, cursorAdapter.getCursor(), parent);
return new EventItemViewHolder(v, cursorAdapter.getCursor());
}
public final class EventItemViewHolder extends UltimateRecyclerviewViewHolder {
int nameIndex, timeIndex ;
TextView tvName, tvTime;
public EventItemViewHolder(View view, Cursor cursor) {
super(view);
tvName = (TextView) view.findViewById(R.id.tv_event_name);
tvTime = (TextView) view.findViewById(R.id.tv_event_time);
nameIndex = cursor.getColumnIndexOrThrow("name");
timeIndex = cursor.getColumnIndexOrThrow("time");
}
}
}
AbstractCursorRecyclerAdapter
public abstract class AbstractCursorRecyclerAdapter extends UltimateViewAdapter {
protected final CursorAdapter cursorAdapter;
protected final Context context;
public AbstractCursorRecyclerAdapter(CursorAdapter cursorAdapter, Context context) {
setHasStableIds(true);
this.cursorAdapter = cursorAdapter;
this.context = context;
}
@Override
public int getAdapterItemCount() {
return cursorAdapter.getCount();
}
@Override
public long getItemId(int position) {
return cursorAdapter.getItemId(position);
}
private Model getItem(int position) {
return (Model) cursorAdapter.getItem(position);
}
public CursorAdapter asCursorAdapter() {
return cursorAdapter;
}
public void remove(int position) {
Model entity = getItem(position);
if (entity != null) {
entity.delete();
notifyDataSetChanged();
}
}
}
Gradle
compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT'
compile 'com.marshalchen.ultimaterecyclerview:library:0.3.2'