2015-01-26 2 views
0

Я не могу понять, почему onLoadFinished не вызывается, когда я вставляю новую строку. Я подтвердил следующееЗагрузка курсора при загрузке фрагмента, а не при изменении данных

  • Строка вставляется OK
  • ContentResolver уведомлена, используя тот же Ури, что CursorLoader создается с
  • The CursorLoader поиски, и (на приложение перезагрузки появится данные) находит, данные при запуске фрагмента.

В Fragment:

public class AlertListFragment extends Fragment 
     implements LoaderManager.LoaderCallbacks<Cursor> { 

    private static final int ALERT_LOADER_ID = 7; 

    private AlertAdapter alertAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     alertAdapter = new AlertAdapter(getActivity(), new ArrayList<Alert>()); 
     ... 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle bundle) { 
     super.onActivityCreated(bundle); 
     getLoaderManager().initLoader(ALERT_LOADER_ID, null, this); 
    } 

    @Override 
    public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
     switch(id) { 
      case ALERT_LOADER_ID: 
       AlertTable table = new AlertTable(); 
       Uri uri = // equivalent to content://my.foo/alert 
       Log.d("Creating CursorLoader for " + uri); 
       String[] columns = {"a", "b", "c"} 
       return new CursorLoader(getActivity(), uri, columns, null, null, "a ASC"); 
      default: 
       throw new IllegalArgumentException("Do not recognise cursor loader of type " + id); 
     } 
    } 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     Log.d("There's new data!!"); 
     if (data.moveToFirst()) { 
      alertAdapter.clear(); 
      do { 
       Alert alert = // code to parse alert from data 
       alertAdapter.add(alert); 
      } while (data.moveToNext()); 
      alertAdapter.notifyDataSetChanged(); 
     } 
    } 

AlertAdapter:

public class AlertAdapter extends ArrayAdapter<Alert> { 

    public AlertAdapter(Context context, List<Alert> items) { 
     super(context, R.layout.alert_item, items); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View rowView = inflater.inflate(R.layout.alert_item, parent, false); 
     TextView labelView = (TextView) rowView.findViewById(R.id.temporary); 
     labelView.setText(getItem(position).toString()); 
     return rowView; 
    } 
} 

AlertProvider:

@Override 
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
    SQLiteDatabase db = dbFactory.getReadableDatabase(); 
    Cursor cursor; 
    switch (getPath(uri)) { 
     case Alerts: 
      cursor = db.query(AlertTable._name, projection, selection, selectionArgs, null, null, sortOrder); 
      break; 
     default: 
      throw new UnsupportedOperationException("Not yet implemented: select from " + uri); 
    } 
    Log.d(format("Found %d %s", cursor.getCount(), uri.toString())); 
    return cursor; 
} 

@Override 
public Uri insert(Uri uri, ContentValues values) { 
    SQLiteDatabase db = dbFactory.getWritableDatabase(); 
    Uri resultUri; 
    switch (getPath(uri)) { // getPath encapsulates matching Uri and converting to enum 
     case Alerts: 
      resultUri = insertInto(db, uri, alertTable, values); 
      break; 
     default: 
      throw new UnsupportedOperationException("Not implemented: insert into " + uri); 
    } 
    getContext().getContentResolver().notifyChange(uri, null); 
    Log.d(format("Inserted %s. Notified %s", resultUri, uri)); 
    return resultUri; 
} 

Наконец, журналы:

При запуске:

D/FXAlerts(2754): Creating CursorLoader for content://my.foo/alert 
D/FXAlerts(2754): Found 5 content://my.foo/alert 
D/FXAlerts(2754): There's new data!! 

На вставке my.foo пункт:

Inserted content://myfoo/alert/a/b. Notified content://my.foo/alert 

И каротаж показывает, что нет ни одного вызова к onLoadFinished после вставки, несмотря на getContext().getContentResolver().notifyChange(uri, null);

ответ

1

После прохождения этого в 10-й раз, Я обнаружил, что я не звонил cursor.setNotificationUri(getContext().getContentResolver(), uri) в конце AlertProvider.query. Добавление этой строки гарантировало, что курсор обнаружит недавно вставленные данные.

Смежные вопросы