2016-09-15 17 views
3

私はここでいくつかのスレッドを実行しましたが、例と一致しているように感じていますが、なぜそれがわからなくても動作しません。AsyncTaskで動的にスピナーにアイテムを追加する

私はAsyncTaskRunnerクラスで、REST APIから情報を取得してから、onPostExecuteでSpinnerに追加しようとしていますが、私のアプリケーションをデバッグ/実行するときは、空の。 webChannelListをデバッグするときに、空ではなく内容があることを確かめてください。

動的に何かを追加しようとしないで、onCreateメソッドで手作業で追加するだけではうまくいきます。それを動的に行う。

私が行ったMainActivityでSOが通過したと言われましたが、動作しません。助けて!

解決策:私はdoInBackground機能でDebug.waitForDebugger();を持っていました...一度削除してしまえば、それは完全に機能しました。

<Spinner 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/singularSpinner" /> 

は私が求めているものに関連していないものをommited

public class MainActivity extends AppCompatActivity { 

    // Global Variables 
    private List<String> webChannelList = new ArrayList<String>(); 
    private Spinner spinner; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Load Singular Web Channels into GUI 
     AsyncTaskRunner runner = new AsyncTaskRunner(this); 
     runner.execute(); 
    } 

    class AsyncTaskRunner extends AsyncTask<Void, Void, Void> { 

     MainActivity mainActivity; 

     @Override 
     protected Void doInBackground(Void... params) { 
     Debug.waitForDebugger(); //REMOVING THIS WORKS    
     webChannelList = StuffFromAPI(); 
     return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
     if (!webChannelList.isEmpty()) { 
      spinner = (Spinner) findViewById(R.id.singularSpinner); 

      // Creating adapter for spinner 
      ArrayAdapter<String> dataAdapter = 
       new ArrayAdapter<String>(mainActivity, android.R.layout.simple_spinner_item, webChannelList); 

      // Drop down layout style - list view with radio button 
      dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

      // Attaching data adapter to spinner 
      spinner.setAdapter(dataAdapter); 
     } 
    } 
    } 
} 

EDIT:はので、私は "hello" を手動でwebChannelList.add(とStuffFromAPI()関数と追加したものをommited );私はStuffFromAPI()関数から完璧に走った。不思議なことに、コメントして手動で追加したにもかかわらず。ほとんどそれはキャッシングのようですか?しかし、今私はそれを複製することはできません..何かが起こっていると私は何を知っていません。私はAndroid開発の初心者ですビルド - >実行またはビルド - >デバッグに行き、タブレットが添付されている。

EDIT 2:私のAPIの項目を取得する前にonPostExecute関数が実行されている可能性はありますか?これはまだ意味がありません。なぜなら、デバッグ時にコンテンツを物理的に見ることができるからです。でも、GUIでは表示されません。

+0

'StuffFromAPI()'メソッドから文字列のリストを取得していることを確認しましたか? –

+0

@ AjayP.Prajapatiはい、私がチェックした最初のことです。私はそこにブレークポイントを置いて、私が追加しようとしているStringコンテンツをはっきりと見ています。ご回答ありがとうございます – user1189352

答えて

1

への応答Edit2:はい、可能です。呼び出しは非同期です。返される配列リストのサイズを確認する必要があります。どのようにデータを取得していますか?

これはあなたの問題ではありませんが、コードを少し違った方法で並べることをおすすめします。

ArrayAdapterおよび応答データリストwebChannelListのメンバーを作成します。その後、onPostExecuteでは、データが変更されたことを通知するだけです。これは少し柔軟性があり、道路を維持するのが簡単です。

ArrayList<someType> webChannelList = new ArrayList<>(); 

protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      spinner = (Spinner) findViewById(R.id.singularSpinner); 

      // Creating adapter for spinner 
      dataAdapter = new ArrayAdapter<String>(mainActivity, android.R.layout.simple_spinner_item, webChannelList); 

      // Drop down layout style - list view with radio button 
      dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

      // Attaching data adapter to spinner 
      spinner.setAdapter(dataAdapter); 

      // Load Singular Web Channels into GUI 
      AsyncTaskRunner runner = new AsyncTaskRunner(this); 
      runner.execute(); 
     } 

     class AsyncTaskRunner extends AsyncTask<Void, Void, Void> { 

      MainActivity mainActivity; 

      @Override 
      protected Void doInBackground(Void... params) { 
       webChannelList = StuffFromAPI(); 
       return null; 
      } 

      @Override 
      protected void onPostExecute(Void result) { 
       dataAdapter.notifyDataSetChanged(); 

      } 
     } 
+0

ありがとうございます。私はチェックした "if(!webChannelList.isEmpty()){"私はOPに入れていないonPostExecuteで..それは意味がない私はちょうどdoInBackground関数の呼び出しを非常に単純にしている。 これがなぜ機能していないのか分かりましたら、私は間違いなくあなたの構造のご褒美を見ていきます。ありがとうございます – user1189352

+0

私はあなたの提案を今見ています..グローバル変数としてdataAdapterを宣言していませんか? – user1189352

+0

はい、それをクラスメンバーとして追加してください。 –

関連する問題