Java onItemSelectedListener和Spinner不返回任何东西

问题描述:

我正在构建货币转换器(从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; 
     } 
    }); 
} 
} 

您没有为适配器设置下拉视图。收藏此线之上setOnItemCLickListener

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

而且,由于您使用的是AsyncTask不要忘记调用下面的线每次你更新列表。

arrayAdapter.notifyDataSetChanged();

注:必须在全球范围内初始化适配。

+0

谢谢你Dustblue。解决方案是我需要通知在AsyncTask中更改的数据集。如果我只应用了arrayadapter视图更改,问题依然存在。我不明白为什么通知电话会影响听众,但我很感激您的额外建议是解决方案。 –

+0

不客气。当列表更新时,更新微调器。根据文档,它“通知附属的观察者,基础数据已经改变,任何反映数据集的视图都应该刷新自己。”这就是为什么它会影响你的听众。别忘了接受我的回答!谢谢。 – dustblue