2016-05-26 19 views
3

Ich habe eine benutzerdefinierte Listenansicht mit einem benutzerdefinierten Adapter erstellt, der aus der Datenbank geladen wurde. Ich kann meine Listenansicht nicht aktualisieren, wenn sich die Daten aus der Datenbank geändert haben. Ich habe bereits versucht, notifysetdatachange() zu verwenden, aber es hat nicht funktioniert. Vielleicht liegt es daran, dass ich den Code falsch geschrieben habe. Bitte helfen Sie mir, dieses Problem zu lösen. Vielen Dank.Wie aktualisiert man Listenansicht in einem benutzerdefinierten Adapter?

ContactActivity.java

public void getImages2(){ 
 
     class GetImages2 extends AsyncTask<Void,Void,Void>{ 
 
      @Override 
 
      protected void onPreExecute() { 
 
       super.onPreExecute(); 
 

 
      } 
 

 
      @Override 
 
      protected void onPostExecute(Void v) { 
 
       super.onPostExecute(v); 
 
       loading.dismiss(); 
 
       customList = new CustomList(ContactActivity.this,GetAlImages2.imageURLs,GetAlImages2.bitmaps,GetAlImages2.code,GetAlImages2.name,GetAlImages2.phone,GetAlImages2.email); 
 
       listView.setAdapter(customList); 
 
       customList.notifyDataSetChanged(); 
 
    
 
       } 
 
      @Override 
 
      protected Void doInBackground(Void... voids) { 
 
       try { 
 
        getAlImages2.getAllImages2(); 
 

 
       } catch (JSONException e) { 
 
        e.printStackTrace(); 
 
       } 
 
       return null; 
 
      } 
 
     } 
 
     GetImages2 getImages = new GetImages2(); 
 
     getImages.execute(); 
 
    }

CustomList.java

public class CustomList extends ArrayAdapter<String> { 
 
    private Bitmap[] bitmaps; 
 
    private String[] urls; 
 
    private String[] code; 
 
    private String[] name; 
 
    private String[] email; 
 
    private String[] phone; 
 

 
    private Activity context; 
 

 
    public CustomList(Activity context, String[] urls, Bitmap[] bitmaps, String[] code, String[] name, String[] phone, String[] email) { 
 
     super(context, R.layout.activity_contact_item, urls); 
 
     this.context = context; 
 
     this.urls= urls; 
 
     this.bitmaps= bitmaps; 
 
     this.code= code; 
 
     this.name= name; 
 
     this.phone= phone; 
 
     this.email = email; 
 
    } 
 

 
}

[EDIT]

Endlich habe ich die Lösung meines Problems gefunden. Meine Listenansicht sollte zuerst überprüft haben, ob der Adapter der Listenansicht leer ist oder nicht. Ich habe diesen Code zu meinem onPostExecute hinzugefügt. Danke für deine Hilfe.

customList = new CustomList(ContactActivity.this,GetAlImages2.imageURLs,GetAlImages2.bitmaps,GetAlImages2.code,GetAlImages2.name,GetAlImages2.phone,GetAlImages2.email); 
 
if(listView.getAdapter() == null){ //Adapter not set yet. 
 
    listView.setAdapter(customList); 
 
} 
 
else{ //Already has an adapter 
 
    listView.setAdapter(customList); 
 
    customList.notifyDataSetChanged(); 
 
    listView.invalidateViews(); 
 
    listView.refreshDrawableState(); 
 
}

+0

die Daten zur Listenansicht oder nicht einstellen ?? –

Antwort

1

Versuchen Sie, diese

In Ihrem onResume() fügen Sie diese

if (listvew!= null) { 
    listvew.invalidateViews(); 
} 
adapter.notifyDataSetChanged(); 
+0

Ich habe Ihren Code versucht, und dann habe ich einen Fehler wie folgt erhalten. java.lang.RuntimeException: Aktivität kann nicht fortgesetzt werden {com.irmaelita.bpsgosurvey/com.irmaelita.bpsgosurvey.ContactActivity}: java.lang.NullPointerException: Versuch, virtuelle Methode aufzurufen 'void com.irmaelita.bpsgosurvey.CustomList.notifyDataSetChanged() ". Was sollte ich jetzt tun? –

+0

wenn meine Antwort nützlich für andere bitte upvote meine Antwort @ IrmaElita – YUVRAJ

1

versuchen Sie bitte diese

new Handler().post(new Runnable() { 
    @Override 
    public void run() { 
     // Code here will run in UI thread 
     adapter.notifyDataSetChanged(); 
    } 
}); 

OR

someActivity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     adapter.notifyDataSetChanged(); 
     } 
}); 
+0

Ich putted Ihren ersten Code in meinem onPostExecute, aber es hat nicht funktioniert. Die Listenansicht wurde nicht aktualisiert. Habe ich etwas falsch gemacht? –

0

Ich glaube, Sie brauchen loader Rückruf an den Aktivitäten zu implementieren, die die Listenansicht enthält .. und Sie können diese Antwort Listview not updating after database update and adapter.notifyDataSetChanged();

Die üblichere Weg zu folgen, dies zu codieren ist:

Fügen Sie diese Schnittstelle zu Ihrer Aktivität:

public class MyActivity extends Activity implementsLoaderManager.LoaderCallbacks<Cursor> 

In onCreate, die ADAP einrichten ter (beachten Sie, dass der Cursor an dieser Stelle null ist):

String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID}; 
int[] to = new int[] { R.id.label }; 
adapter = new SimpleCursorAdapter(this, R.layout.todo_row, null, from, to, 0); //Note that the cursor is null 
lw.setAdapter(adapter); 

den Lader einleiten:

getLoaderManager().initLoader(0, null, this); 

Dies erfordert onCreateLoader in einem Hintergrund-Thread (also, wenn Ihre Abfrage lange es läuft nicht Blockiere den UI-Thread). Wenn der Vorgang abgeschlossen ist, wird onLoadFinished im UI-Thread aufgerufen, in dem Sie den neuen Cursor austauschen können.

Nachdem Sie tun, um eine Lösch- oder zu aktualisieren, starten Sie den Lader:

getLoaderManager().restartLoader(0, null, this); 

Dies erfordert onLoaderReset, die den vorhandenen Cursor aus dem Adapter entfernt und ruft dann onCreateLoader wieder in einem neuen zu tauschen.

Schließlich fügen Sie diese Methoden:

public Loader<Cursor> onCreateLoader(int id, Bundle args) 
{ 
    String[] from = new String[] { TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_ID}; 
    String where = TodoTable.COLUMN_DELETED + " = ?"; 

    Loader<Cursor> loader = new CursorLoader(this, TodoContentProvider.CONTENT_URI, from, where, new String[] {"0"}, null);  
    return loader; 
} 

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
{ 
    adapter.swapCursor(cursor); 
} 

public void onLoaderReset(Loader<Cursor> loader) 
{ 
    adapter.swapCursor(null); 
} 
+0

Ich bin Neuling. Und ich weiß nicht, wie ich diesen Code in meinen Code implementiere. Könnten Sie mir bitte zeigen, wie es geht? –

+0

Siehe die aktualisierte Antwort jetzt – Shruti

Verwandte Themen