2017-07-19 7 views
0

これを解決しようとしている複数のスレッドを調べましたが、 "mListView .setAdapter(mAdapter); "ライン。ビュー階層を作成した元のスレッドのみがビューに触れることができますが、UIスレッドに移動しようとしましたが、何も動作しないようです

public void populateListView() // adds each string from json file to the listview of puzzles 
{ 
    try { 
     String[] strings = mPuzzleNames.toArray(new String[mPuzzleNames.size()]); 

     mAdapter = new ArrayAdapter<>(mContext, android.R.layout.simple_list_item_1, android.R.id.text1, strings); 
     mListView.setAdapter(mAdapter); 
     mAdapter.notifyDataSetChanged(); //updates UI 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

} 
+0

'populateListView()'を呼び出すのは何ですか?どのようにこれをUIスレッドに移動しましたか? – Cheticamp

+0

populateListView()はAsyncTaskで呼び出されるため、バックグラウンドスレッド上にあると思います。 そして、私は({公共ボイド実行(UI } を更新する){ //もの @Override }新しいRunnableを()) 'runOnUiThreadを入れてみました;'(申し訳ありませんすべての編集について私は私の人生のためにこのフォーマットを理解することはできません) –

+0

これは 'AsyncTask'の' doInBackground() 'から呼び出されますか?もしそうなら、それはバックグラウンドにあります。あなたが試したときに 'runOnUiThread'とはどうなりますか?あなたはそのコードを共有できますか? – Cheticamp

答えて

0

ハンドラを使用してみてください:

public void populateListView() { 
    try { 
     String[] strings = mPuzzleNames.toArray(new String[mPuzzleNames.size()]); 

     Handler handler = new Handler(Looper.getMainLooper()); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       mAdapter = new ArrayAdapter<>(mContext, android.R.layout.simple_list_item_1, android.R.id.text1, strings); 
       mListView.setAdapter(mAdapter); 
      } 
     }); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

また、あなたが実際にアダプターを毎回再作成されているようmAdapter.notifyDataSetChanged()をコールする必要はありません。

関連する問題