0

我正在構建貨幣轉換器(從API獲取,動態填充列表以創建可用貨幣,選擇兩種貨幣並返回匯率,這似乎是通過練習的權利)。Java onItemSelectedListener和Spinner不返回任何東西

我一直在試圖讓Spinner工作,但儘管我盡了最大的努力,但我無法讓偵聽器在我從列表中選擇一個值時做任何事情。當我點擊某個值時,日誌確實會返回一些內容(請參閱下文),但我不知道它的含義,以及爲什麼它不會返回我想要的System.out.println("yay")呼叫。

d/OpenGLRenderer:帶手柄0x95c21270" 上0xa7040980 (DropDownListView)endAllActiveAnimators

陣列適配器正常填充從ArrayList<string>我從API獲得和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