1

我有一个带有动态项目的Spinner 。通过单击微调器,它将加载一组新的项目。它在实际设备上完美运行。但是当我在任何模拟器上运行应用程序时,单击微调器后它会抛出NullPointerException 。我没有从任何人那里找到任何解决方案。有人能帮助我吗?

这是来自 LogCat 的错误(对于不同设备和 API 级别的所有模拟器,该错误都是相同的——但不会在真实设备上发生。)。如您所见,它不指向我的任何代码行。

java.lang.NullPointerException
at android.widget.Spinner.makeAndAddView(Spinner.java:534)
at android.widget.Spinner.layout(Spinner.java:485)
at android.widget.Spinner.onLayout(Spinner.java:449)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4362)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4362)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948)
at android.view.View.layout(View.java:13754)
...
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

这是我如何将项目放在列表中的方式。

List<MyObject> itemsList = getItemsFromMySource();
if (itemsList!=null && itemsList.size() > 0) {
    CustomListAdapter adapter = new CustomListAdapter(getActivity(), itemsList);
    mySpinner.setAdapter(adapter);
}

我的 CustomListAdapter 使用微调器的默认布局。

public class CustomListAdapter extends ArrayAdapter<MyObject> {

    public CustomListAdapter (Context context, List<MyObject> listItems) {
        super(context, android.R.layout.simple_spinner_item, listItems);
        setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    }


    @Override
    public View getView(final int item, View convertView, final ViewGroup parent) {
        final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(android.R.layout.simple_spinner_item, parent, false);

        final TextView text = (TextView) convertView.findViewById(android.R.id.text1);
        text.setText(getItem(item).getItemName());

        return convertView;
    }

    @Override
    public View getDropDownView(final int item, View convertView, final ViewGroup parent) {
        final LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);

        final TextView text = (TextView) convertView.findViewById(android.R.id.text1);
        text.setText(getItem(item).getItemName());

        return convertView;
    }

任何帮助将不胜感激。

4

2 回答 2

6

切勿将微调器适配器设置为空!

mySpinner.setAdapter(null);

我这样做是因为我在应用程序的功能中需要它。所以我只是习惯于mySpinner.setEnabled(false)妥协。

于 2013-12-03T16:53:53.643 回答
0

这里是 android.R.layout.simple_spinner_dropdown_item 的内容:

<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
**
** Copyright 2008, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
-->
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/dropdownListPreferredItemHeight"
    android:ellipsize="marquee"
    android:textAlignment="inherit"/>

请在 res/layout 文件夹中创建一个名为“simple_spinner_dropdown_item.xml”的新文件。然后复制/粘贴之前的代码。

然后,android.R.layout.simple_spinner_dropdown_itemR.layout.simple_spinner_dropdown_item您的CustomListAdapter.

这里的主要思想是,也许您的模拟器没有集成 android simple_spinner_dropdown_item.xml,因此通过将其复制到您的应用程序中,您可以防止inflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);返回 null 然后获取 NullPointerException。

我不知道它是否会起作用,但值得一试。

于 2013-10-31T17:07:12.797 回答