0

我花了數小時試圖調試此代碼。基本上我有MainActivity與你開始一個新項目後得到的默認代碼。 這是我MainActivityFragment嘗試顯示字符串列表的奇怪的NullPointerException

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" /> 

這裏是堆棧跟蹤說:

致命異常:主要 過程:應用程序。 XXXX。 github.io.sunshine,PID:4652 顯示java.lang.NullPointerException:嘗試在一個空 對象引用
在 機器人調用虛擬方法 '無效 android.widget.TextView.setText(java.lang.CharSequence中)' .widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:399) 在android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)

很抱歉,如果它得到了一點點的難看,但不得不放棄了足夠的上下文問題。謝謝。

+0

您在'ArrayAdapter'構造函數調用中傳遞錯誤的'R.id'。它需要是列表項佈局中的'TextView'的ID - 'R.id.list_item_forecast_textview' - 或者只是刪除該參數,如果佈局只是'TextView'。 –

+0

** id **是R.id.list_item_forecast_textview。 –

回答

0

你應該提供list_item_TextView的id,而不是ListView本身。 因此改變你的代碼

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

你的適配器給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); 
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); 
0

您正在使用此構造函數創建適配器實例。

/** 
    * 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);