2012-07-23 168 views
0

我在使用List类型填充Spinner时遇到一些问题。从列表中填充微调器

目的:当Button按下主菜单上,它执行其填充新的屏幕上一个Spinner任务GetTownsTask,但设置Adapter时,它打破。

MainActivity.java

private class GetTownsTask extends AsyncTask<Void, Void, List<String>> { 
    @Override 
    protected List<String> doInBackground(Void... p) { 

     // api calls 
     List<String> towns = new ArrayList<String>(); 
     // populate towns 
     return towns; 
    } 

    @Override 
    protected void onPostExecute(List<String> townList) { 

     Spinner spinner = (Spinner) findViewById(R.id.spinner); 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       MainActivity.this, 
       android.R.layout.simple_spinner_dropdown_item, 
       townList.toArray(new String[0])); 
     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spinner.setAdapter(adapter); // line 124, breaks here 
    } 
} 

崩溃日志

FATAL EXCEPTION: main, 
java.lang.NullPointerException, 
at com.project.MainActivity$TestTask.onPostExecute(MainActivity.java:124) 

微调屏幕

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#787878"> 

    <Spinner 
     android:id="@+id/spinner" 
     android:layout_width="200dip" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/townTextView" 
     android:layout_below="@+id/townTextView" 
     android:layout_marginTop="10dp" /> 

</RelativeLayout> 
+0

返回值是'spinner'是'null'。你把它添加到你的'XML'文件中? – 2012-07-23 15:48:17

+0

'spinner'为null,很难说出为什么没有任何额外的代码。 – dmon 2012-07-23 15:48:27

+0

您的城镇位于顶部,但您打电话给townList.toArray()。您是否通过在onPostExecute方法中进行调试来检查townList是否为空? – kosa 2012-07-23 15:48:29

回答

0

的问题是机智h townList.toArray(new String[0])。尝试使用townList.toArray(),这将确保创建的字符串数组与townList的大小相同。

+1

'''townList.toArray()'必须被铸造成带有此错误的String [] java.lang.ClassCastException:java.lang.Object []不能转换为java.lang.String []' – Michael 2012-07-23 15:59:22

0

//填充您的SPINNER喜欢这个

package com.javasamples; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 
import android.widget.TextView; 

public class ArrayAdapterDemo2 extends Activity implements 
     AdapterView.OnItemSelectedListener { 
    TextView selection; 
    String[] items = { "this", "is", "a", "really", 
      "really2", "really3", 
      "really4", "really5", "silly", "list" }; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     selection = (TextView) findViewById(R.id.selection); 

     Spinner spin = (Spinner) findViewById(R.id.spinner); 
     spin.setOnItemSelectedListener(this); 

     ArrayAdapter aa = new ArrayAdapter(
       this, 
       android.R.layout.simple_spinner_item, 
       items); 

     aa.setDropDownViewResource(
      android.R.layout.simple_spinner_dropdown_item); 
     spin.setAdapter(aa); 
    } 

    public void onItemSelected(AdapterView<?> parent, View v, int position, 
      long id) { 
     selection.setText(items[position]); 
    } 

    public void onNothingSelected(AdapterView<?> parent) { 
     selection.setText(""); 
    } 
}//class 

这必将帮助你。

谢谢:)

+0

你看到它不包含“townList”变量的问题,因为他没有提供完整的代码。我鼓励尽快帮助一个人 – SALMAN 2012-07-23 16:03:38

0
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       MainActivity.this, 
       android.R.layout.simple_spinner_dropdown_item, 
       townList.toArray(new String[0])); 

看来你并不需要.toArray你可以一个List<String>对象传递给ArrayAdapter构造。

因此,尝试,

ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       MainActivity.this, 
       android.R.layout.simple_spinner_dropdown_item, 
       townList); 

这假定townList实际上是被填充在doInBackground()和它在被传递到onPostExecute(townList)