【问题标题】:Weird NullPointerException for attempting to display a List of Strings [duplicate]尝试显示字符串列表的奇怪 NullPointerException [重复]
【发布时间】:2016-06-14 02:57:38
【问题描述】:

我花了几个小时试图调试这段代码。基本上我有MainActivity 和你在开始一个新项目后得到的默认代码。 这是我的MainActivityFragment

package app.xxxx.github.io.sunshine;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.Arrays;
import java.util.List;
public class MainActivityFragment extends Fragment {

    public MainActivityFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        String[] fakeData = new String[]{
                "Today - Sunny - 88/63",
                "Tomorrow - Foggy - 70/46",
                "Weds - Cloudy - 72/63",
                "Thurs - Rainy - 64/51",
                "Fri - Foggy - 70/46",
                "Sat - Sunny - 76/68"
        };
        List<String> weatherData = Arrays.asList(fakeData);
        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                    R.id.listview_forecast, weatherData);
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        ListView listview = (ListView) rootView.findViewById(R.id.listview_forecast);
        listview.setAdapter(myAdapter);
        return rootView;}}

如您所见,我只是试图在屏幕上显示一些虚拟字符串。

这里是FragmentMain.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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="app.xxxx.github.io.sunshine.MainActivityFragment"
    tools:showIn="@layout/activity_main">

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

</FrameLayout>

list_item_forecast.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:gravity="center_vertical"
    android:id="@+id/list_item_forecast_textview" />

堆栈跟踪是这样说的:

致命异常:主要 进程:app.xxxx.github.io.sunshine,PID:4652 java.lang.NullPointerException:尝试调用虚拟方法'void android.widget.TextView.setText(java.lang.CharSequence)' 为空 对象引用
在 android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:399) 在 android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)

对不起,如果它有点难看,但必须为问题提供足够的上下文。谢谢。

【问题讨论】:

  • 您在 ArrayAdapter 构造函数调用中传递了错误的 R.id。它必须是列表项布局中 TextView 的 ID - R.id.list_item_forecast_textview - 如果布局只是 TextView,则删除该参数。
  • idR.id.list_item_forecast_textview.

标签: android android-layout android-fragments android-studio nullpointerexception


【解决方案1】:

您应该提供 list_item_TextView 的 id,而不是 ListView 本身。 所以把你的代码改成

 ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                R.id.list_item_forecast_textview, weatherData);

【讨论】:

    【解决方案2】:

    将您的 TextView 的 id 修复到 ArrayAdapter 的声明中:

     ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                            R.id.list_item_forecast_textview, weatherData);
    

    或者,使用内置的TextView如下:

     ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                            android.R.id.text1, weatherData);
    

    【讨论】:

      【解决方案3】:

      您是否在适配器中提供了错误的 textview id

       ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                          R.id.listview_forecast, weatherData);
      

      所以用

      替换这一行
       ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                          R.id.list_item_forecast_textview, weatherData);
      

      【讨论】:

        【解决方案4】:

        您正在使用此构造函数来创建适配器实例。

            /**
             * Constructor
             *
             * @param context The current context.
             * @param resource The resource ID for a layout file containing a layout to use when
             *                 instantiating views.
             * @param textViewResourceId The id of the TextView within the layout resource to be populated
             * @param objects The objects to represent in the ListView.
             */
            public ArrayAdapter(Context context, @LayoutRes int resource, @IdRes int textViewResourceId,
                    @NonNull T[] objects) {
                this(context, resource, textViewResourceId, Arrays.asList(objects));
            }
        

        它使用

        @param textViewResourceId The id of the TextView within the layout resource to be populated
        

        因为你使用的是自定义布局,所以你必须传递正确的 textView id 来填充数据

        简单地改变

        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                        R.id.listview_forecast, weatherData);
        

        ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(getActivity(), R.layout.list_item_forecast,
                        R.id.list_item_forecast_textview, weatherData);
        

        【讨论】:

          猜你喜欢
          • 2018-05-29
          • 2012-10-01
          • 2019-11-20
          • 2011-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-03
          • 1970-01-01
          相关资源
          最近更新 更多