Android ArrayAdapter要求资源ID为TextView

时间:2014-03-21 09:55:02

标签: java android android-arrayadapter

我不明白为什么会遇到这个问题。

03-21 10:46:40.739: E/AndroidRuntime(5114): java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView

这是我的代码:

    headers = new ArrayAdapter<String>(context, R.layout.separated_list_header);

separated_list_header.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/list_header_title"
        style="?android:attr/listSeparatorTextViewStyle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/ab_bottom_solid_emtheme"
        android:paddingBottom="2dip"
        android:paddingLeft="5dip"
        android:paddingTop="2dip"
        android:textAllCaps="false"
        android:textColor="@color/white" />

如果我不创建ArrayAdapter,我的应用程序崩溃就会给出TextView id:

    headers = new ArrayAdapter<String>(context, 
              R.layout.separated_list_header, R.id.list_header_title);

我在另一个项目中也这样做,我没有看到这个问题。由于xml的根项是TextView,我认为它应该可行。

编辑:我找到了问题的原因,这是因为这个ArrayAdapter用在另一个适配器(SeparatedListAdapter)中,然后当调用getView时,convertView的类型不正确。所以我现在通过将convertView设置为null来强制创建新视图来解决问题。这不是一个好的解决方案,因为它使用了太多的资源,但至少它可以工作。现在我必须找到为什么convertView不正确。

这是我修改过的SeparatedListAdapter的getView()方法:

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
        int sectionnum = 0;
        for(Object section : this.sections.keySet()) {
            Adapter adapter = sections.get(section);
            int size = adapter.getCount() + 1;

            // check if position inside this section 
            if(position == 0) {
            convertView = null; //Force creating new view because convertView is not of the right type
            return headers.getView(sectionnum, convertView, parent);
            }
            if(position < size) return adapter.getView(position - 1, convertView, parent);

            // otherwise jump into next section
            position -= size;
            sectionnum++;
        }
        return null;
    }: 

2 个答案:

答案 0 :(得分:0)

参考这些Android Docs

public ArrayAdapter(Context context,int resource,int textViewResourceId,List<T> objects

我以为你错过了初始化List接口对象。

答案 1 :(得分:-1)

您应该尝试使用layoutmanager(即LinearLayout)包装TextView。