2016-04-07 12 views
0

Ich habe ein Problem mit der Aktualisierung des Bildschirms, nachdem ich eine Zeichenfolge zu meinem Listview hinzufügen. Ich füge die Zeichenfolge hinzu und dann verwende ich adapter.notifyDataSetChanged(), aber der Bildschirm wird nicht aktualisiert, bis die Funktion beendet ist. Ich brauche es sofort zu aktualisieren, nachdem ich die Zeichenfolge zur Listenansicht hinzufügenWie man Android ListView von innerhalb einer Funktion aktualisiert

public class MainActivity extends AppCompatActivity { 
public ArrayList listaConectados; 
private TextView estado; 
private ListView listaView; 
public static int x; 
private ArrayAdapter<String> adapter; 
private ArrayList<String> arrayList; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    estado = (TextView)findViewById(R.id.estado_TextView); 
    listaConectados = new ArrayList<Dispositivos>(); 
    arrayList = new ArrayList<String>(); 
    listaView = (ListView) findViewById(R.id.listaConectados_listView); 

    adapter = new ArrayAdapter<String>(getApplicationContext(), 
      android.R.layout.simple_list_item_1,arrayList); 
    listaView.setAdapter(adapter); 

} 
public void searchConnectedDispositives(View view) { 
    ArrayList listaParaActualizar = new ArrayList<String>(); 
    int i; 
    int x; 
    String ip = getIpAddress(); 
    String ipVariable = ip.substring(0,10); 
    for(i=0;i<255;i++){ 
     int result=10; 
     String ipTemp = ipVariable +String.valueOf(i); 
     try { 
      result=pingHost(ipTemp); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     if(result==0){ 
      Dispositivos nuevo = new Dispositivos(ipTemp); 
      arrayList.add(ipTemp); 
      adapter.add(ipTemp); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

Die Funktion searchConnectedDispositives aufgerufen wird, wenn ich eine Taste berühren. Wenn diese Funktion endet, wird die Aktivität aktualisiert.

+0

Was ist der Implementierungscode pingHost (ipTemp)? –

+0

führen Sie 'searchConnectedDispositives' im Hintergrund aus? Sie können nur Ihre Benutzeroberfläche im Hauptthread ändern. – gesuwall

+0

@ShadabAnsari pingHost (ipTemp) zurückgeben 0 wenn Verbindung herstellen (Senden von Ping zu iphost) zurück 0 http://pastebin.com/rSzr0MDT hier der vollständige Code. –

Antwort

0

Das Beobachten Ihres Codes führt mich dazu herauszufinden, dass die wahre Ursache für Ihr Problem pingHost() ist, die proc.waitFor(); und waitFor() einen blockierenden Anruf hat. Das bedeutet, dass Sie den UI-Thread halten (weil dies der Thread ist, in dem Sie Ihre Operation ausführen). Und der Grund, warum Ihre ListView nur in der letzten aktualisiert wird und ich bin sicher, dass es nur in der letzten Iteration von for loop aktualisiert wird, ist das gleiche Problem wie here und ich habe die Antwort für die gleiche geschrieben. Du kannst es lesen .

+0

Danke für die Antwort, aber ich verstehe nicht, wo ich den Handler-Code setzen sollte. –

+0

Sie müssen pingHost() in Nicht-UI-Thread und nachdem es abgeschlossen ist, können Sie Ihre Liste aktualisieren. Zu diesem Zweck können Sie auch AsyncTask verwenden. Überprüfen Sie diese -http: //developer.android.com/training/multiple-threads/communicate-ui.html –

+0

Ich mache das, aber es funktioniert nicht. http://pastebin.com/YPt8Lqwd Ich habe Ihre Zeit wirklich sehr genossen, sehr danke. –

Verwandte Themen