0

私は通貨コンバータを構築しています(APIから取得し、動的に使用可能な通貨を作成し、2つの通貨を選択してレートを返します。Java onItemSelectedListenerとSpinnerが返されない何か

私はSpinnerを動作させようとしてきましたが、私の最善の努力にもかかわらず、リストから値を選択するときにリスナーに何もさせられないようです。値をクリックすると、ログに何かが返されます(下記参照)が、何を意味するのかわかりませんし、なぜ私が望むSystem.out.println("yay")呼び出しを返さないのでしょうか。

D/OpenGLRenderer:ハンドル0x95c21270" と0xa7040980 (DropDownListView)のendAllActiveAnimators

配列アダプタが正しく、私はAPIから取得する取得ArrayList<string>JSONオブジェクトからスピナーリストを埋めています。リスナーのコードは、私がSO、これまでに見つかった例に基づいて、適切に見えます。

それが注文私のコードでは問題か、それとも何か他のものかしら。

package com.timlee.currencymate; 

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemSelectedListener; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Iterator; 

    public class MainActivity extends AppCompatActivity { 

// public variables 
    String uRLResultString = ""; 
    ArrayList <String> currencies = new ArrayList<String>(); 
    Spinner currencyOneSpinner; 
    Spinner currencyTwoSpinner; 

// get data from api 
public class DownloadTask extends AsyncTask <String, Void, String> { 

    @Override 
    protected String doInBackground(String... urls) { 
     URL url; 
     HttpURLConnection urlConnection = null; 

     try { 
      url = new URL(urls[0]); 
      urlConnection = (HttpURLConnection)url.openConnection(); 
      InputStream in = urlConnection.getInputStream(); 
      InputStreamReader reader = new InputStreamReader(in); 

      int data = reader.read(); 

      while (data != -1) { 
       char current = (char) data; 
       uRLResultString += current; 
       data = reader.read(); 
      } 

      return uRLResultString; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 

     //System.out.println(result); 
     //if get current list then run this, else run something else 
     getCurrencyList(); 

    } 
} 

//gets the list of currecies 
public void getCurrencyList() { 

    try { 

     JSONObject jsonObject = new JSONObject(uRLResultString); 
     String base = jsonObject.getString("base"); 
     String rates = jsonObject.getString("rates"); 
     currencies.add(base); 
     System.out.println(rates); 

     JSONObject jSonObj = new JSONObject(rates); 

     Iterator<String> keys = jSonObj.keys(); 

     while (keys.hasNext()) { 
      String key = (String)keys.next(); 
      currencies.add(key); 
      if (jSonObj.get(key) instanceof JSONObject) { 
      } 
     } 

     Collections.sort(currencies, String.CASE_INSENSITIVE_ORDER); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 

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

    currencies = new ArrayList<String>(); 

    String currencyURL = "http://api.fixer.io/latest?base=AUD"; 
    DownloadTask task = new DownloadTask(); 
    task.execute(currencyURL); 

    // apply Array Adapter and listener 
    currencyOneSpinner = (Spinner)findViewById(R.id.spinnerCurrencyOne); 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this,android.R.layout.simple_spinner_item,currencies); 
    currencyOneSpinner.setAdapter(arrayAdapter); 
    currencyOneSpinner.setOnItemSelectedListener (new OnItemSelectedListener() { 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      System.out.println("yay"); 
      return; 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      System.out.println("neyh"); 
      return; 
     } 
    }); 
} 
} 

答えて

0

アダプタのドロップダウンビューを設定しませんでした。 setOnItemCLickListener

currencyOneSpinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

の上にこの行を追加します。そして、あなたはAsyncTaskを使用しているので、あなたがリストを更新以下の行毎回呼び出すことを忘れないでください。

arrayAdapter.notifyDataSetChanged();

注:グローバルアダプタを初期化する必要があります。

+0

ありがとうDustblue。解決策は、AsyncTaskで変更されたデータセットに通知する必要がありました。 arrayadapterビューの変更のみを適用した場合、問題は残りました。通知呼び出しがリスナーに影響を与える理由はまだわかりませんが、あなたの余分なアドバイスが解決策であることに感謝しています。 –

+0

あなたは大歓迎です。リストが更新されると、スピナーを更新します。その文書によると、添付されたオブザーバーに、基礎となるデータが変更され、データセットを反映するビューが更新されなければならないことを通知します。それがあなたのリスナーに影響を与えた理由です。私の答えを受け入れることを忘れないでください!ありがとう。 – dustblue

関連する問題