package com.ronakmanglani.watchlist.ui.adapter;
import android.content.Context;
import android.database.Cursor;
import android.database.DataSetObserver;
import android.support.v7.widget.RecyclerView;
/*
* Credit to skyfishjy gist:
* https://gist.github.com/skyfishjy/443b7448f59be978bc59
* for the CursorRecyclerViewApater.java code and idea.
*/
public abstract class CursorAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>{
private static final String LOG_TAG = CursorAdapter.class.getSimpleName();
private int rowIdColumn;
private boolean dataIsValid;
private Cursor mCursor;
private DataSetObserver mDataSetObserver;
public CursorAdapter(Context context, Cursor cursor) {
mCursor = cursor;
dataIsValid = cursor != null;
rowIdColumn = dataIsValid ? mCursor.getColumnIndex("_id") : -1;
mDataSetObserver = new NotifyingDataSetObserver();
if (dataIsValid) {
mCursor.registerDataSetObserver(mDataSetObserver);
}
}
public Cursor getCursor() {
return mCursor;
}
public Cursor swapCursor(Cursor newCursor) {
if (newCursor == mCursor) {
return null;
}
final Cursor oldCursor = mCursor;
if (oldCursor != null && mDataSetObserver != null) {
oldCursor.unregisterDataSetObserver(mDataSetObserver);
}
mCursor = newCursor;
if (mCursor != null) {
if (mDataSetObserver != null) {
mCursor.registerDataSetObserver(mDataSetObserver);
}
rowIdColumn = newCursor.getColumnIndexOrThrow("_id");
dataIsValid = true;
notifyDataSetChanged();
} else {
rowIdColumn = -1;
dataIsValid = false;
notifyDataSetChanged();
}
return oldCursor;
}
@Override
public int getItemCount() {
if (dataIsValid && mCursor != null) {
return mCursor.getCount();
}
return 0;
}
@Override
public long getItemId(int position) {
if (dataIsValid && mCursor != null && mCursor.moveToPosition(position)){
return mCursor.getLong(rowIdColumn);
}
return 0;
}
@Override
public void setHasStableIds(boolean hasStableIds) {
super.setHasStableIds(true);
}
@Override
public void onBindViewHolder(VH viewHolder, int position) {
if (!dataIsValid) {
throw new IllegalStateException("This should only be called when Cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("Could not move Cursor to position: " + position);
}
onBindViewHolder(viewHolder, mCursor);
}
public abstract void onBindViewHolder(VH viewHolder, Cursor cursor);
private class NotifyingDataSetObserver extends DataSetObserver{
@Override
public void onChanged() {
super.onChanged();
dataIsValid = true;
notifyDataSetChanged();
}
@Override
public void onInvalidated() {
super.onInvalidated();
dataIsValid = false;
notifyDataSetChanged();
}
}
}