Android: notifyDataSetChanged heißt aber Listenansicht nicht aktualisiert
Habe ich diese ListView, die ist bevölkert von einem JSON-Daten im web. Aber wenn ich aktualisiert, die JSON-Eintrag ein, beispielsweise das hinzufügen eines neuen Eintrags der ListView nicht mehr aktualisiert. Es zeigt nicht den neuen Eintrag auf der Liste obwohl ich bereits genannt, die notifyDataSetChanged().
Kann jemand mir helfen? Danke.
Hier ist mein code:
public class ProjectsList extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.projects_list);
Intent serviceIntent = new Intent(this, LooserSync.class);
startService(serviceIntent);
ListView listView = (ListView) findViewById(R.id.lstText);
MySimpleCursorAdapter projectAdapter = new MySimpleCursorAdapter(this, R.layout.listitems,
managedQuery(Uri.withAppendedPath(LooserProvider.CONTENT_URI,
Database.Project.NAME), new String[] { BaseColumns._ID,
Database.Project.C_PROJECTTITLE, Database.Project.C_SMALLIMAGE }, null, null,
null), new String[] { Database.Project.C_PROJECTTITLE, Database.Project.C_SMALLIMAGE }, new int[] {
R.id.txt_title, R.id.image });
listView.setAdapter(projectAdapter);
projectAdapter.notifyDataSetChanged();
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent(ProjectsList.this, DetailsActivity.class);
i.setData(Uri.withAppendedPath(Uri.withAppendedPath(
LooserProvider.CONTENT_URI, Database.Project.NAME), Long
.toString(id)));
i.putExtra("spendino.de.ProjectDetail.position",position);
startActivity(i);
}
});
}
class MySimpleCursorAdapter extends SimpleCursorAdapter {
public MySimpleCursorAdapter(Context context, int layout, Cursor c,
String[] from, int[] to) {
super(context, layout, c, from, to);
loader = new ImageLoaderCache(context);
this.context = context;
}
Activity activity= ProjectsList.this;
Context context=null;
ImageLoaderCache loader = null;
public void setViewImage(ImageView v, String value) {
v.setTag(value);
loader.displayImage(value, activity, v);
}
}
}
AKTUALISIERT, hier ist die LooserSync.java
public class LooserSync extends IntentService {
public LooserSync() {
super("LooserSyncService");
}
@Override
protected void onHandleIntent(Intent intent) {
Database.OpenHelper dbhelper = new Database.OpenHelper(getBaseContext());
SQLiteDatabase db = dbhelper.getWritableDatabase();
DefaultHttpClient httpClient = new DefaultHttpClient();
db.beginTransaction();
HttpGet request = new HttpGet(
"http://liebenwald.spendino.net/admanager/dev/android/projects.json");
try {
HttpResponse response = httpClient.execute(request);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
InputStream instream = response.getEntity().getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(
instream), 8000);
StringBuilder total = new StringBuilder();
String line;
while ((line = r.readLine()) != null) {
total.append(line);
}
instream.close();
String bufstring = total.toString();
JSONArray arr = new JSONArray(bufstring);
Database.Tables tab = Database.Tables.AllTables.get(Database.Project.NAME);
tab.DeleteAll(db);
for (int i = 0; i < arr.length(); i++) {
tab.InsertJSON(db, (JSONObject) arr.get(i));
}
db.setTransactionSuccessful();
}
} catch (Exception e) {
e.printStackTrace();
}
db.endTransaction();
db.close();
}
}
- Sie haben vergessen 'getContentResolver().notifyChange( Uri.withAppendedPath(LooserProvider.CONTENT_URI, Datenbank.Projekt.NAME), null); " aus meinem letzten Beispiel gibt es ein Menü namens sync, um zu zeigen, wie, um Daten zu aktualisieren
- So habe ich mich auf dieses, 'listView.setAdapter(projectAdapter); getContentResolver().notifyChange(Uri.withAppendedPath(LooserProvider.CONTENT_URI, Datenbank.Projekt.NAME), null);' aber ich weiß nicht, warum Sie den neuen Eintrag auf meiner Liste nicht Lesen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als man mit einem cursor, um die Liste zu füllen, müssen Sie einen neuen oder requery der alten nach, die Sie verändern (hinzufügen, Bearbeiten oder entfernen) etwas auf Ihr Modell.
Wenn du einen neuen cursor Sie können an den adapter durch Aufruf changeCursor().
UPDATE
Folgenden code erhalten Sie einen neuen cursor jedes mal, wenn onResume() aufgerufen. Also deine Liste sollte aktuell sein. Natürlich änderungen am Modell, die gemacht werden, während die Liste angezeigt wird, werden nicht aktualisiert in der Liste. Wenn Sie möchten, eine live-Aktualisierung der Liste, die Sie implementieren müssen, um eine Art des observer-Musters. So wird Ihre Aktivität möchte benachrichtigt werden, wenn das Modell geändert.
projectAdapter.notifyDataSetChanged();
ersetzen Sie die oben genannte Zeile mit der angegebenen Schlag-Zeile dann hast du die Lösung Ihres Problems.
((MySimpleCursorAdapter)(ProjectsList.listView.getAdapter())).notifyDataSetChanged();
Fehler: Sie bekommen sollte-adapter von der Liste Ansicht nach, dass Sie teilen der adapter von der Liste.