2016-06-01 67 views
-2

ListViewArrayListを設定しようとしています。これはAndroidのFragmentから解決されていません。 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object referenceというエラーが表示されます。ListViewがnullに戻る

onActivityCreatedの方法では、ListViewを初期化するにはどうすればよいですか?

Fragment.java

private static final String TAG = SystemConditionsFragment.class.getSimpleName(); 

    private OnFragmentInteractionListener mListener; 

    private ListView lv; 

    private ListAdapter adapter; 

    private ArrayList<String> alerts; 

    private ProgressDialog progDailog; 

    public SystemConditionsFragment() { 
     // Required empty public constructor 
    } 

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment SystemConditionsFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static SystemConditionsFragment newInstance(String param1, String param2) { 
     SystemConditionsFragment fragment = new SystemConditionsFragment(); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_system_conditions, container, false); 
    lv = (ListView) rootView.findViewById(R.id.listView); 
    return rootView; 
} 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
      mListener = (OnFragmentInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     refresh(); 
    } 
    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public void refresh() { 

     progDailog = ProgressDialog.show(getActivity(), "Loading","Please wait...", true); 
     progDailog.setCancelable(false); 

     progDailog.dismiss(); 

     final ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(new JsonOrgModule()); 

     Log.d(TAG, "Requesting events data"); 
     VolleyUtils.makeJsonObjectRequest(getActivity().getApplicationContext(), 
       "events", 
       new VolleyResponseListener() { 

        @Override 
        public void onError(String message) { 
         Log.e(TAG, "Error requesting events: " + message); 
        } 

        @Override 
        public void onResponse(JSONObject response) { 
         Log.d(TAG, "Received events response " + response); 

         DataRestResponse<SysCondRecord> data = mapper.convertValue(
           response, 
           new TypeReference<DataRestResponse<SysCondRecord>>() {}); 
         // Group by timestamp 
         ImmutableMultimap<DateTime, SysCondRecord> indexedData = 
           Multimaps.index(data.getData(), 
             new Function<SysCondRecord, DateTime>() { 
              @Override 
              public DateTime apply(SysCondRecord record) { 
               return record.getTimeStamp(); 
              } 
             }); 
         alerts = new ArrayList<>(); 
         final List<DateTime> timestamp = new ArrayList<>(); 
         for (SysCondRecord record : data.getData()) { 
          timestamp.add(record.getTimeStamp()); 
          alerts.add(record.getMessage()); 
         } 

         adapter = new ArrayAdapter(getActivity(),R.layout.fragment_system_conditions, R.id.listView, alerts); 


         lv.setAdapter(adapter); 
        } 
       }); 
    } 

fragment_system_conditions.xml

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/listView" 
    android:layout_below="@+id/sysCondView" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="36dp" /> 

編集

私は私の悪い、間違ったIDの連中を使用して、実際にありました!しかし、私は、画面の向きを変更したときにそれらが再接続され、)私はonResume(で表示項目を初期化する傾向がある

FATAL EXCEPTION: main 
Process: xx.xxx.com, PID: 26183 


java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 
+0

'fragment_system_conditions.xml'には、' android:id = "@ + id/sysCondView" 'を持つリストビューが含まれていますか?それはあなたがnullになる1つの理由です。 –

+2

さて、あなたは 'R.id.sysCondView'を見つけようとしていますが、あなたのListViewのIDは' R.id.listView'です... 'sysCondView'は何ですか? ? –

+0

ニースのスポット@ cricket_007。私はxmlで編集されたバージョンを見たことがありません。偉大な仕事の男、私はここで4ヶ月間、あなたが3Kの担当者と同じようにしていたので、ここであなたに続いてきました。大ファン:D – Vucko

答えて

2

findViewByIdを使用する場合は、android:id属性のXMLを参照する必要があります。

<ListView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/listView"    <!-- This line --> 
    android:layout_below="@+id/sysCondView" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="36dp" /> 

また、@+id構文は、あなただけは、それらを参照のみ(+なし)"@id/sysCondView"を使用したいときは、リソースへの idを追加するために使用されるべきです。

RelativeLayoutの参照の前に、そのIDの実際のビューも持っている必要があります。


第2の課題

java.lang.IllegalStateException: ArrayAdapter requires the resource ID to be a TextView 

は、この行を指している

adapter = new ArrayAdapter(getActivity(),R.layout.fragment_system_conditions, R.id.listView, alerts); 

これらR.layoutR.idパラメータの両方が正しくありません。

あなたはyour own custom adapterを定義する、またはresourceobjectsリスト内のすべてのオブジェクトがtoString() D」になり、その場合にはandroid.R.layout.simple_list_item_1同様のTextViewに対応

ArrayAdapter (Context context, int resource, List<T> objects) 

を使用することができます。

+0

助けてくれてありがとう、非常に感謝します。私は先週Androidから始めた –

+0

ようこそ。間違いなく基本の学習曲線です。慣れてくるのに数ヶ月かかりましたが、[documentation](https://developer.android.com/guide/topics/ui/declaring-layout.html#AdapterViews)の例は非常に詳細です。 –

0

...物事が悪化しているように見えます。しかし、私はまた、私ができるならば、断片を避けようとします。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View rootView = inflater.inflate(R.layout.fragment_system_conditions, container, false); 
    lv = (ListView) rootView.findViewById(R.id.listView); 
    return rootView; 
} 

EDIT:あなたはR.id.listViewでそれを置き換える、リストビューのために間違ったidを使用していたので、のようなあなたのonCreateView中に、

lv = (ListView) getView().findViewById(R.id.listView); 

+0

私はAndroidが初めてです。私は複数のフラグメントを持っています –

+0

私は最後のポイントをここに設定できると思います:onStart()あなたがそれを置こうとしたポイントは何ですか? – Flummox

0

は、単純にこの初期化を移動します。

+0

私はまだnullポインタを取得しますが、今回は 'java.lang.NullPointerException:仮想メソッドを呼び出そうとしました 'nullヌルオブジェクトリファレンスでvoid android.widget.ListView.setAdapter(android.widget.ListAdapter)'を実行しました。 –

+0

私たちがソリューションに一歩近づいていることを意味します。あなたは同意しませんか?私はもう一度見てみましょう... – Vucko

+0

'getView()。findViewById'を避け、' rootview.findViewById'を私の答えのようにします。この 'adapter = new ArrayAdapter(getActivity()、R.layout.fragment_system_conditions、R.id.listView、alerts)も試してみてください。 lv.setAdapter(アダプター); 'onCreateView'でも同様です。 – Vucko

関連する問題