ListView内的Spinner的ArrayAdapter会导致出现Inflater错误

时间:2014-04-23 14:42:21

标签: android listview spinner android-arrayadapter layout-inflater

我在listview中有一个微调器(仅在第一行)。 作为微调器的适配器,我试图使用arrayadapter,但每次我将我的字符串添加到适配器时,应用程序崩溃。如果我只是在没有任何字符串的情况下设置适配器,它就会起作用并在第一个listrow中显示空的微调器。

我的活动:

public class TestView extends Activity implements OnItemClickListener, OnItemSelectedListener
{
    private ListView testPersonList;

    private DBManager dbManager;
    private FileManager fileManager;
    private FormularManager formularManager;
    private TestPersonListAdapter testPersonListAdapter;

    private String testName;
    private Bundle configFile;
    private String[] languages;
    private String aktLanguagecode;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.test_view);

        testPersonList = (ListView) findViewById(R.id.test_view_persons_listview);



Intent intent = getIntent();
    testName = intent.getStringExtra(ConstantVariables.BUNDLE_TESTTRACK_NAME);

    fileManager = new FileManager(this);
    formularManager = new FormularManager(this);
    configFile = fileManager.readConfigFile(testName);
    languages = formularManager.getLanguagesOfOneFormular(configFile.getString(ConstantVariables.BUNDLE_FORMULAR));

    dbManager = new DBManager(this, ConstantVariables.TESTTRACKS + testName + ConstantVariables.SERIAL, testName);
    testPersonListAdapter = new TestPersonListAdapter(this, dbManager.getTestPersons());
        testPersonList.addHeaderView(testPersonListHeader(languages));
        testPersonList.setAdapter(testPersonListAdapter);
        testPersonList.setOnItemClickListener(this);
    }

    private View testPersonListHeader(String[] languages)
    {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View header = new View(this);
        header = inflater.inflate(R.layout.new_testperson_listrow, null);

        Spinner languageSpinner = (Spinner) header.findViewById(R.id.new_testperson_languagespinner);
        LanguageSpinnerAdapter spinnerAdapter = new LanguageSpinnerAdapter(this, R.layout.spinner_listrow, languages);
        languageSpinner.setAdapter(spinnerAdapter);

        languageSpinner.setOnItemSelectedListener(this);

        return header;
    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
    }
}

我的列表适配器:

public class TestPersonListAdapter extends BaseAdapter {

    private Cursor cursor;
    private LayoutInflater inflater;

    public TestPersonListAdapter(Context context, Cursor cursor)
    {
        this.cursor = cursor;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount()
    {
        return (cursor.getCount() + 1);
    }

    @Override
    public Object getItem(int position)
    {
        cursor.moveToPosition(position);
        return cursor.getString(cursor.getColumnIndex(ConstantVariables.DB_COLUMN_PERSON));
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View itemView = convertView;

        itemView = inflater.inflate(R.layout.testperson_listrow, null);
        TextView person = (TextView) itemView.findViewById(R.id.testperson_persontext);
        TextView categories = (TextView) itemView.findViewById(R.id.testperson_categorytext);

        if(cursor.moveToPosition(position-1))
        {
            person.setText(cursor.getString(cursor.getColumnIndex(ConstantVariables.DB_COLUMN_PERSON)));

        }
        return itemView;
    }

}

我的自定义arrayadapter

public class LanguageSpinnerAdapter extends ArrayAdapter<String>
{
    private String[] languages;

    public LanguageSpinnerAdapter(Context context, int resource, String[] objects)
    {
        super(context, resource, objects);
        this.languages = objects;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        return super.getDropDownView(position, convertView, parent);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    public View getCustomView(int position, View convertView, ViewGroup parent)
    {
        View row = convertView;

        if (row == null) {
            row = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_listrow, parent, false);
        }

        TextView language_tv = (TextView) row.findViewById(R.id.spinner_row_language);
        language_tv.setText(languages[position]);

        return row;
    }
}

new_testperson_listrow.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_large_bg_normal_selector" >

    <ImageView
        android:id="@+id/new_testperson_listicon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        android:src="@drawable/list_icon_add_testperson_selector" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/new_testperson_listicon"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/new_testperson_addtext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Start Questionaire"
            android:textColor="@drawable/list_text_selector"
            android:textSize="15pt" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/new_testperson_listicon"
            android:orientation="horizontal" >

            <TextView
                android:id="@+id/new_testperson_languagetext"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingRight="30dp"
                android:text="Language"
                android:textColor="@drawable/list_text_selector"
                android:textSize="10pt" />

            <Spinner
                android:id="@+id/new_testperson_languagespinner"
                android:layout_width="150dp"
                android:layout_height="wrap_content"
                android:background="@drawable/spinner_dropdown_selector"/>
        </LinearLayout>
    </LinearLayout>

    <ImageView
        android:id="@+id/new_testperson_listarrow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:paddingRight="30dp"
        android:src="@drawable/list_icon_arrow_selector" />

</RelativeLayout>

spinner_listrow.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/spinner_background_selector" >

    <TextView
        android:id="@+id/spinner_row_language"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:paddingLeft="30dp"
        android:paddingRight="30dp"
        android:text="test"
        style="@style/TextView_normal"/>

</RelativeLayout>

spinner_background_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false" android:color="@color/textcolor_orange"/>
    <item android:state_pressed="true"><shape>
            <solid android:color="@color/textcolor_white" />

            <padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp" />
        </shape></item>

    <item android:state_pressed="true"><shape>
            <solid android:color="@color/textcolor_orange" />

            <padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp" />
        </shape></item>

</selector>

日志

    04-23 17:58:26.484: E/AndroidRuntime(29813): FATAL EXCEPTION: main
04-23 17:58:26.484: E/AndroidRuntime(29813): Process: com.example.questiohmnaire, PID: 29813
04-23 17:58:26.484: E/AndroidRuntime(29813): android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at com.example.questiohmnaire.adapter.LanguageSpinnerAdapter.getCustomView(LanguageSpinnerAdapter.java:36)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at com.example.questiohmnaire.adapter.LanguageSpinnerAdapter.getView(LanguageSpinnerAdapter.java:28)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.Spinner.onMeasure(Spinner.java:482)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.ListView.setupChild(ListView.java:1870)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.ListView.makeAndAddView(ListView.java:1793)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.ListView.fillDown(ListView.java:691)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.ListView.fillFromTop(ListView.java:752)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.ListView.layoutChildren(ListView.java:1630)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.AbsListView.onLayout(AbsListView.java:2091)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.Choreographer.doCallbacks(Choreographer.java:574)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.Choreographer.doFrame(Choreographer.java:544)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.os.Handler.handleCallback(Handler.java:733)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.os.Looper.loop(Looper.java:136)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at android.app.ActivityThread.main(ActivityThread.java:5017)
04-23 17:58:26.484: E/AndroidRuntime(29813):    at java.lang.reflect

导致错误的行是:

row = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_listrow, parent, false);

我感谢任何帮助。我现在已经试了好几个小时来解决这个错误,但没有任何效果...... 提前谢谢!

2 个答案:

答案 0 :(得分:3)

在修复你拥有的内容之前,有一些非常重要的事情:当你的位置= 0时,在getView上充气和设置适配器。这将是definitelly 杀死列表视图性能,请注意每当使用&#34; 0&#34;调用getView时,你总是会做非常非常非常重的事情。每次用户滚动时都会发生

所以你需要重组你的程序。第一件事是,旋转器,创造&amp;只填充一次。 在getView之外。然后,如果position==0您可以快速退回。

鉴于您只需要微调器作为第一行,我建议您使用listView.addHeaderView(view)。这个方便的方法允许您为ListView定义一个始终作为第一个项目呈现的标题,从而消除getView的复杂性,可以专注于渲染正常项而不是根据位置执行非正统的事物。在设置适配器之前,请务必致电addHeaderView

如果您不喜欢Header方法并按照自己的方式行事,那么还有一个警告:您必须考虑这样一个事实:当Spinner行0退出屏幕时,该行视图将会在convertView传递给您以呈现正常项目(又名View 回收)。然后,您必须销毁(稍后重新创建)微调器,或实现不同的项类型方法:getItemTypeCountgetItemType ......否则会发生灾难。

所以在简历中:

  • 正常创建您的微调器,与您创建ListView
  • 的级别相同
  • Spinner添加到ListView作为标题视图
  • getView中删除与微调器相关的所有复杂性。让getView专注于普通的ListView项目。

您将获得正常运行的ListView!

答案 1 :(得分:1)

您为微调器创建了自定义布局,因此您需要创建一个扩展ArrayAdapter或类似内容的自定义适配器。

或者,如果您只想显示包含单个TextView的列表,则无需指定自定义布局,只需使用:

ArrayAdapter<String> adapter = ArrayAdapter.createFromResource(context, <your_string_array_in_xml>, android.R.layout.simple_spinner_item);

ArrayAdapter<String> adapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item, <your_string_array>);

如果您确实需要制作自定义Spinner,请点击此链接,确保它可以帮助您:http://mrbool.com/how-to-customize-spinner-in-android/28286