Java Udacity Sunshine应用程序-第1课-尝试显示模拟ListView时出现NullPointerException

Java Udacity Sunshine应用程序-第1课-尝试显示模拟ListView时出现NullPointerException,java,android,nullpointerexception,Java,Android,Nullpointerexception,我正在udacity.com上接受Android开发人员培训,随后是Sunshine应用程序的实施。我使用的是Android Studio,最新版本的默认安装 我现在应该有一个包含模拟数据的ListView,我得到了一个NullPointerException: 07-23 13:12:51.371 1677-1677/com.mydomain.sunshine E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.mydomain.su

我正在udacity.com上接受Android开发人员培训,随后是Sunshine应用程序的实施。我使用的是Android Studio,最新版本的默认安装

我现在应该有一个包含模拟数据的ListView,我得到了一个NullPointerException:

07-23 13:12:51.371    1677-1677/com.mydomain.sunshine E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mydomain.sunshine, PID: 1677
java.lang.NullPointerException
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:392)
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
        at android.widget.AbsListView.obtainView(AbsListView.java:2263)
        at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
        at android.widget.ListView.onMeasure(ListView.java:1175)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
        at android.view.View.measure(View.java:16497)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
        at android.view.Choreographer.doCallbacks(Choreographer.java:574)
        at android.view.Choreographer.doFrame(Choreographer.java:544)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
我运行了调试器并确定它发生在以下位置:

            listView.setAdapter(mForeCastAdapter);
当我对它进行注释时,它会运行,但显然没有显示任何内容,但至少不会崩溃

这是我的MainActivity.java的onCreateView()

@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
字符串[]预测数组={
“福”,
“酒吧”,
“巴兹”,
“菲兹”,
};
List-weekForecast=newarraylist(Arrays.asList(forecastArray));
mForeCastAdapter=新阵列适配器(
getActivity(),
R.layout.list\u item\u forecast,
R.id.listview\U预测,
周预测);
ListView ListView=(ListView)rootView.findViewById(R.id.ListView\u forecast);
setAdapter(mForeCastAdapter);
返回rootView;
}
这是我的fragment_main.xml:

<FrameLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity$PlaceholderFragment">

<ListView
    android:id="@+id/listview_forecast"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" /></FrameLayout>

最后是我的列表_item _forecast.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
/>

谢谢你

变化:

mForeCastAdapter = new ArrayAdapter<String>(
                getActivity(),
                R.layout.list_item_forecast,
                R.id.listview_forecast,
                weekForecast);
mForeCastAdapter=新阵列适配器(
getActivity(),
R.layout.list\u item\u forecast,
R.id.listview\U预测,
周预测);
致:

mForeCastAdapter=新阵列适配器(
getActivity(),
R.layout.list\u item\u forecast,
周预测);
您正在使用的构造函数中的ID参数应该是行布局内部
TextView
的ID。但是,只有当您的行布局不仅仅是
TextView
时,才需要这样做。就你而言:

  • 行布局只是一个
    文本视图
    ,因此不需要提供ID

  • 您提供的ID不是针对行布局中的
    TextView
    ,而是针对其他位置的
    ListView


如果上述解决方案不适用于您,并且您正在物理设备上进行测试,请检查纵向和横向布局是否都声明了ListView。AS可能会为您创建两个文件,如果只将ListView添加到一个文件中,然后您在测试期间切换方向,则会发生NPE。

哇,太快了,谢谢!您的解决方案有效:-)谢谢!的确非常感谢Dso接受有效的答案,顺便说一句,这个答案的海报写了一本关于android的书
mForeCastAdapter = new ArrayAdapter<String>(
                getActivity(),
                R.layout.list_item_forecast,
                R.id.listview_forecast,
                weekForecast);
mForeCastAdapter = new ArrayAdapter<String>(
                getActivity(),
                R.layout.list_item_forecast,
                weekForecast);