2012-09-05 81 views
-1

我有一個適用於ListView類的適配器,但是當我想使用此適配器作爲微調器時,我收到一個錯誤。 當我使用微調控制器進行活動時,它顯示列表中的第一項,但是當我單擊箭頭以顯示其他項目時,也會出現錯誤。 有人能告訴我我做錯了什麼嗎?爲ListView工作的自定義適配器是否也適用於Spinner?

適配器類:適配器的

public class AreaAdapter extends ArrayAdapter<Area> { 

    List<Area> areaList; 

    public AreaAdapter(Context context, int textViewResouceId, 
      List<Area> objects) { 
     super(context, textViewResouceId, objects); 
     areaList = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      Context c = getContext(); 
      LayoutInflater inflater = (LayoutInflater) c 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(
        R.layout.activity_choose_area_adapter, null); 
     } 

     Area area = areaList.get(position); 

     if (area != null) { 
      TextView v = null; 

      v = (TextView) convertView.findViewById(R.id.tareaname); 
      v.setText(area.getAreaName()); 
     } 

     return convertView; 
    } 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/linearLayout2" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="0.72" 
     android:orientation="vertical" > 

     <TextView 
      android:id="@+id/tareaname" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:text="Large Text" 
      android:textAppearance="?android:attr/textAppearanceLarge" /> 

    </LinearLayout> 

</LinearLayout> 

活動包含旋轉器:

public class ExtrasAddItemActivity extends Activity{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_extras_add_item); 

     ActivitiesObjects ao = (ActivitiesObjects) this.getApplication(); 
     List<Area> listOfAreas = ao.getListOfAreas(); 

     Spinner spinnerArea = (Spinner)findViewById(R.id.spinnerExtraArea); 
     AreaAdapter areaAdapter = new AreaAdapter(this,R.layout.activity_choose_area_adapter, listOfAreas); 
     spinnerArea.setAdapter(areaAdapter); 
    } 
} 

XML隨着旋轉器:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    // other widgets ... 

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

</LinearLayout> 

錯誤日誌:提前

09-05 13:36:05.347: D/dalvikvm(274): GC_EXTERNAL_ALLOC freed 813 objects/59328 bytes in 54ms 
09-05 13:36:10.487: W/KeyCharacterMap(274): No keyboard for id 0 
09-05 13:36:10.487: W/KeyCharacterMap(274): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
09-05 13:36:13.058: E/ArrayAdapter(274): You must supply a resource ID for a TextView 
09-05 13:36:13.058: D/AndroidRuntime(274): Shutting down VM 
09-05 13:36:13.068: W/dalvikvm(274): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
09-05 13:36:13.101: E/AndroidRuntime(274): FATAL EXCEPTION: main 
09-05 13:36:13.101: E/AndroidRuntime(274): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:347) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.ArrayAdapter.getDropDownView(ArrayAdapter.java:376) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.Spinner$DropDownAdapter.getDropDownView(Spinner.java:329) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.Spinner$DropDownAdapter.getView(Spinner.java:325) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.AbsListView.obtainView(AbsListView.java:1315) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.ListView.measureHeightOfChildren(ListView.java:1198) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.ListView.onMeasure(ListView.java:1109) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.View.measure(View.java:8171) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.View.measure(View.java:8171) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1012) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.LinearLayout.measureVertical(LinearLayout.java:381) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.LinearLayout.onMeasure(LinearLayout.java:304) 
09-05 13:36:13.101: E/AndroidRuntime(274): at com.android.internal.widget.WeightedLinearLayout.onMeasure(WeightedLinearLayout.java:60) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.View.measure(View.java:8171) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.View.measure(View.java:8171) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3132) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.View.measure(View.java:8171) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.ViewRoot.performTraversals(ViewRoot.java:801) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.os.Handler.dispatchMessage(Handler.java:99) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.os.Looper.loop(Looper.java:123) 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.app.ActivityThread.main(ActivityThread.java:4627) 
09-05 13:36:13.101: E/AndroidRuntime(274): at java.lang.reflect.Method.invokeNative(Native Method) 
09-05 13:36:13.101: E/AndroidRuntime(274): at java.lang.reflect.Method.invoke(Method.java:521) 
09-05 13:36:13.101: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
09-05 13:36:13.101: E/AndroidRuntime(274): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
09-05 13:36:13.101: E/AndroidRuntime(274): at dalvik.system.NativeStart.main(Native Method) 
09-05 13:36:13.101: E/AndroidRuntime(274): Caused by: java.lang.ClassCastException: android.widget.LinearLayout 
09-05 13:36:13.101: E/AndroidRuntime(274): at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:340) 
09-05 13:36:13.101: E/AndroidRuntime(274): ... 34 more 

謝謝, 亞歷克斯

+0

ArrayAdapter希望提供的資源ID引用單個TextView。你總是引用你的XML的根元素 - 在這種情況下,它恰好是一個LinearLayout,它不是一個TextView。 –

+0

ArrayAdapter從BaseAdapter繼承,您可以擴展它。這會自動實現ListAdapter和SpinnerAdapter。 –

回答

1

的問題是,對於R.layout.activity_choose_area_adapter的XML不是文本視圖:該適配器是好的,但微調顯式地要求它是一個文本視圖,而不是一個複雜的視圖。如果你想要一個複雜的視圖,你必須自己複製Spinner的行爲。用android.R.layout.simple_list_item_1之類的東西替換R.layout.activity_choose_area_adapter,你應該沒問題。

Spinner spinnerArea = (Spinner)findViewById(R.id.spinnerExtraArea); 
AreaAdapter areaAdapter = new AreaAdapter(this,android.R.layout.simple_list_item_1, listOfAreas); 
spinnerArea.setAdapter(areaAdapter); 

您可能還可能需要修改Adapter使用過的資源,而不是硬連線的。

相關問題