मेरे पास एक साधारण सामग्री प्रदाता है, एक सूची दृश्य वाला एक लेआउट और सामग्री प्रदाता और कर्सर लोडर में आइटम जोड़ने के लिए एक बटन है। http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html#onLoadFinished(android.content.Loader, डी) संदर्भ कहा गया है किक्यों कर्सर लोडर ने स्रोत डेटा में परिवर्तनों को सूचित नहीं किया?
लोडर डेटा में परिवर्तन के लिए निगरानी, और उन्हें करने के लिए यहाँ नई कॉल के माध्यम से रिपोर्ट करेंगे। आपको डेटा को मॉनिटर नहीं करना चाहिए। उदाहरण के लिए, यदि डेटा एक कर्सर है और आप या तो FLAG_AUTO_REQUERY या FLAG_REGISTER_CONTENT_OBSERVER में गुजर बिना CursorAdapter (android.content.Context, android.database.Cursor, पूर्णांक) निर्माता एक CursorAdapter में रखें, का उपयोग (अर्थात , ध्वज तर्क के लिए 0 का उपयोग करें)। यह CursorAdapter को को कर्सर की अपनी देखरेख करने से रोकता है, जिसकी आवश्यकता नहीं होती है क्योंकि परिवर्तन होता है, तो आपको एक नया कर्सर यहां एक और कॉल फेंक देगा।
लेकिन ऑनलोड लोड विधि में Log.info लाइन निष्पादित नहीं की गई थी और सूची दृश्य रीफ्रेश नहीं किया गया था। यहां मेरा (सरल) कोड है:
public class HomeActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>{
static final String TAG = "HomeActivity";
SimpleCursorAdapter adapter;
ListView listAnnunciVicini;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home);
listAnnunciVicini = (ListView) findViewById(R.id.lista_annunci_vicini);
adapter = new SimpleCursorAdapter(this, R.layout.list_item, null,
new String[] {
ContentDescriptor.Annunci.Cols.ID,
ContentDescriptor.Annunci.Cols.TITOLO,
ContentDescriptor.Annunci.Cols.DESCRIZIONE
}, new int[] {
R.id.list_annunci_item_id_annuncio,
R.id.list_annunci_item_titolo_annuncio,
R.id.list_annunci_item_descrizione_annuncio
}, 0);
listAnnunciVicini.setAdapter(adapter);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getSupportLoaderManager().initLoader(0, null, this).forceLoad();
}
public void addRandomItem(View sender) {
ContentValues dataToAdd = new ContentValues();
dataToAdd.put(ContentDescriptor.Annunci.Cols.TITOLO, "Titolo");
dataToAdd.put(ContentDescriptor.Annunci.Cols.DESCRIZIONE, "Lorem ipsum dolor sit amet.");
this.getContentResolver().insert(ContentDescriptor.Annunci.CONTENT_URI, dataToAdd);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// creating a Cursor for the data being displayed.
String[] proiezione = new String[] {ContentDescriptor.Annunci.Cols.ID, ContentDescriptor.Annunci.Cols.TITOLO, ContentDescriptor.Annunci.Cols.DESCRIZIONE };
CursorLoader cl = new CursorLoader(this, ContentDescriptor.Annunci.CONTENT_URI, proiezione, null, null, null);
return cl;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
adapter.swapCursor(data);
Log.i(TAG, "I dati sono stati ricaricati");
}
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
adapter.swapCursor(null);
}
}
कोई सुझाव?
मैं एंड्रॉइड 3.X + के नए लोडर्स एपीआई का उपयोग कर रहा हूं क्योंकि पुराने प्रबंधितQuery विधि को बहिष्कृत किया गया है। और मैंने अपने ContentProvider में चेंज विधि भी सूचित की है .. – ilcaduceo
स्पष्ट होने के लिए, मैं कर्सर लोडर के बारे में भी बता रहा था। – ernazm
मैं हमेशा अपनी क्वेरी में नोटिफिकेशन यूरी सेट करना भूल जाता हूं और हमेशा सोचता हूं कि कर्सर लोडर रीफ्रेश क्यों नहीं कर रहा है ...: - | – Tarun