2016-04-07 7 views
0

リストビューに文字列を追加した後、画面をリフレッシュするときに問題があります。文字列を追加してからadapter.notifyDataSetChanged()を使用しますが、機能が終了するまで画面は更新されません。私は私がリストビュー私は1つのボタンをタッチすると、関数searchConnectedDispositivesが呼び出される1つの関数の中からAndroid ListViewを更新する方法

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(); 
     } 
    } 

に文字列を追加した後、それはすぐにリフレッシュする必要があります。この機能が終了すると、アクティビティがリフレッシュされます。

+0

pingHost(ipTemp)実装コードとは何ですか? –

+0

バックグラウンドで 'searchConnectedDispositives'を実行していますか?メインスレッドでのみUIを変更できます。 – gesuwall

+0

@ShadabAnsari pingHost(ipTemp)接続を確立すると0を返す(iphostにpingを送る)0 http://pastebin.com/rSzr0MDTここに完全なコード。 –

答えて

0

あなたのコードを観察すると、問題の本当の原因はproc.waitFor();waitFor()のブロックコールであるpingHost()であることがわかります。 これはUIスレッドを保持していることを意味します(これは、操作を実行しているスレッドなので)。 そして、あなたのListViewが最後に更新され、あなたのfor loopの最後の反復でのみ更新されると確信する理由は、hereと同じ問題であり、同じ答えを掲載しました。あなたはそれを読むことができます。

+0

答えをありがとう、しかし私はハンドラのコードを置く必要があります理解していません。 –

+0

UI以外のスレッドでpingHost()を実行する必要があり、完了後にリストを更新することができます。このためにAsyncTaskも使用できます。これを確認する-http://developer.android.com/training/multiple-threads/communicate-ui.html –

+0

私はこれをしますが、動作しません。 http://pastebin.com/YPt8Lqwd 本当に感謝しています。とても感謝しています。 –

関連する問題