I have an activity called ListActivity
containing of a recycler view and a Loader, I have a NavigationDrawer in this Activity. Now when I press an item in the NavigationDrawer I want my recycler view to refresh accordingly.
In my onCreate:
mRecyclerView = (RecyclerView) findViewById(R.id.detailsList);
Loader:
ListActivity.this.getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(ListActivity.this, EmployeeContentProvider.URI_EMPLOYEES, Employee.FIELDS, null, null, Employee.COL_NAME);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor mCur) {
if (mCur != null && mCur.moveToFirst()) {
do {
EmployeeItem empInstance = new EmployeeItem();
empInstance.setCall(mCur.getString(mCur.getColumnIndexOrThrow("mobile")));
empInstance.setEmail(mCur.getString(mCur.getColumnIndexOrThrow("email")));
empInstance.setEmpID(mCur.getString(mCur.getColumnIndexOrThrow("empid")));
empInstance.setImageURL(mCur.getString(mCur.getColumnIndexOrThrow("image")));
empInstance.setName(mCur.getString(mCur.getColumnIndexOrThrow("name")));
employeeList.add(empInstance);
} while (mCur.moveToNext());
adapter = new DetailsRecyclerAdapter(ListActivity.this, employeeList);
mRecyclerView.setAdapter(adapter);
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
}
});
The above is working flawless. Now in the onClick of my Navigation Drawer:
@Override
public void onDrawerItemSelected(View view, int position, String value) {
Log.d("Department selected: ", value);
final String selectionArgs = value.trim();
ListActivity.this.getLoaderManager().restartLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return new CursorLoader(ListActivity.this, EmployeeContentProvider.URI_EMPLOYEES, Employee.FIELDS, Employee.COL_DEPARTMENT + " IS ? COLLATE NOCASE", new String[]{selectionArgs}, Employee.COL_NAME);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor mCur) {
if (mCur != null && mCur.moveToFirst()) {
do {
EmployeeItem empInstance = new EmployeeItem();
empInstance.setCall(mCur.getString(mCur.getColumnIndexOrThrow("mobile")));
empInstance.setEmail(mCur.getString(mCur.getColumnIndexOrThrow("email")));
empInstance.setEmpID(mCur.getString(mCur.getColumnIndexOrThrow("empid")));
empInstance.setImageURL(mCur.getString(mCur.getColumnIndexOrThrow("image")));
empInstance.setName(mCur.getString(mCur.getColumnIndexOrThrow("name")));
employeeList.add(empInstance);
} while (mCur.moveToNext());
adapter = new DetailsRecyclerAdapter(ListActivity.this, employeeList);
mRecyclerView.setAdapter(adapter);
System.out.println("restarted loader");
}
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
System.out.println("reset loader");
}
});
}
In the above I think the loader is executing as I get the System.out
logs, but my RecyclerView does not refresh. What am I missing here? My DB is bridged with a content provider and I have set the selection and selection args properly.
Below are the relevant parts of my ContentProvider:
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
System.out.println("Provider"+selection+selectionArgs);
Cursor result = null;
if (URI_EMPLOYEES.equals(uri)) {
result = DatabaseHandler
.getInstance(getContext())
.getReadableDatabase()
.query(Employee.TABLE_NAME, Employee.FIELDS, selection, selectionArgs, null, null, Employee.COL_NAME, null);
result.setNotificationUri(getContext().getContentResolver(), URI_EMPLOYEES);
} else if (uri.toString().startsWith(EMPLOYEE_BASE)) {
final long id = Long.parseLong(uri.getLastPathSegment());
result = DatabaseHandler
.getInstance(getContext())
.getReadableDatabase()
.query(Employee.TABLE_NAME, Employee.FIELDS,
Employee.COL_ID + " IS ?",
new String[]{String.valueOf(id)}, null, null,
null, null);
result.setNotificationUri(getContext().getContentResolver(), URI_EMPLOYEES);
} else {
throw new UnsupportedOperationException("Not yet implemented");
}
return result;
}