2012-05-30 3 views
0

내 JSON 데이터 Object를 listView 조각에 바인딩 할 때 문제가 있습니다. 내 간단한 어댑터에 바인딩하는 100 줄에 NPE가 있습니다. 나는 이것에 대해 여러 가지 방법을 시도했지만 성공하지 못했습니다. the docs에 따르면 :조각에 ListView 개체를 바인딩하는 방법?

당신은 어댑터와 목록을 연결하는 ListFragment.setListAdapter()를 사용해야합니다. ListView.setAdapter()를 직접 호출하지 마십시오. 그렇지 않으면 중요한 초기화를 건너 뜁니다.

나는 그것이 내 문제이지만 내 코드를 수정하는 방법을 모르겠다. 아래는 NPE와 나의 활동입니다. 주요 자바 : 스레드 캐치되지 않는 예외 (그룹 = 0x40a781f8) 치명적인 예외로 종료 : 내가 가서 내가

threadid = 1 .... 배우고 있기 때문에 어떤 도움, esp는 몇 가지 코드 예제를 이해할 수있을 것이다하시기 바랍니다. com.andaero.app.NavigationListFragment $ 1.callback에서 com.andaero.app.NavigationListFragment의 $의 1.callback (NavigationListFragment.java:100) 에서 android.widget.SimpleAdapter. (SimpleAdapter.java:85)에서 lang.NullPointerException (NavigationListFragment.java:1) at com.androidquery.callback.AbstractAjaxCallback.callback (AbstractAjaxCallback.java:440) at android.os.Handler.handleCallback에서 com.androidquery.callback.AbstractAjaxCallback.afterWork com.androidquery.callback.AbstractAjaxCallback.run (AbstractAjaxCallback.java:804)에서 (AbstractAjaxCallback.java:1010) (Handler.java:605) at android.os.Handler.dispatchMessage (Handler.java:92) at android.os.Looper.loop (Looper.java:137) at android.app.ActivityThread.main (ActivityThread.java:4424) at 의 java.lang.reflect.Method.invokeNative (네이티브 메소드) 의 java.lang.reflect.Method.invoke (Method.java:511) com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit. java : 787) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:554) d alvik.system.NativeStart.main (기본 방법)

public class NavigationListFragment extends ListFragment { 
    Context context; 
    private Activity c; 
    final AQuery aq = new AQuery(c); 
    private static String url = "http://192.168.1.17/Andaero/php/regulatory_list.php"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.listview, container, false); 
     Log.i("NavigationListFragment", "ListView Inflated!!"); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     // AsyncTasks.getJSONArrays(context);// asynchronous task for getting 
     // JSONarray 
     aq.ajax(url, JSONArray.class, new AjaxCallback<JSONArray>() { 
      // JSON Node names 
      private static final String TAG_ID = "_id"; 
      private static final String TAG_LABEL = "label"; 
      private static final String TAG_TITLE = "title"; 
      private static final String TAG_DISCR = "description"; 
      private static final String TAG_GO2URL = "gotoURL"; 

      public void callback(String url, JSONArray json, AjaxStatus status) { 
       if (json != null) { 
        // NavigationListFragment.jsonListCallback(json); 
        Log.i("NavigationListFragment", "Caught JSON: " + json.toString()); 
        // Hashmap for ListView 
        ArrayList<HashMap<String, String>> mList = new ArrayList<HashMap<String, String>>(); 
        try { 
         // Parse the string to a JSON object 
         for (int i = 0; i < json.length(); i++) { 
          JSONObject json_data = json.getJSONObject(i); 

          // Storing each json item in variable 
          String id = json_data.getString(TAG_ID); 
          String label = json_data.getString(TAG_LABEL); 
          String title = json_data.getString(TAG_TITLE); 
          String description = json_data.getString(TAG_DISCR); 
          String gotoURL = json_data.getString(TAG_GO2URL); 

          // creating new HashMap 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // adding each child node to HashMap key => value 
          map.put(TAG_ID, id); 
          map.put(TAG_LABEL, label); 
          map.put(TAG_TITLE, title); 
          map.put(TAG_DISCR, description); 
          map.put(TAG_GO2URL, gotoURL); 

          // adding HashList to ArrayList 
          mList.add(map); 
          Log.i("NavigationListFragment", "Hash: " + map); 
         } 
        } catch (JSONException e) { 
         Log.e("log_tag", "Error parsing data " + e.toString()); 
        } 

        // create the list item mapping 
        String[] from = new String[] {TAG_LABEL, TAG_TITLE, TAG_DISCR, TAG_GO2URL}; 
        int[] to = new int[] { R.id.listLabel, R.id.listTitle, R.id.listDiscription, R.id.dummy }; 

        // Updating parsed JSON data into ListView 
        SimpleAdapter adapter = new SimpleAdapter(c, mList, R.layout.list_item, from, to);//<--NPE IS HERE 
        setListAdapter(adapter); 

        // selecting single ListView item 
        ListView lv = getListView(); 

        // Launching new screen on Selecting Single ListItem 
        lv.setOnItemClickListener(new OnItemClickListener() { 

         public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 
          //TODO 
         } 
        }); 

       } 
       // Log any network/JSON Errors 
       switch (status.getCode()) { 
        case AjaxStatus.TRANSFORM_ERROR : 
         Log.i("GetJSONArray", "TRANSFORM_ERROR"); 
         break; 
        case AjaxStatus.NETWORK_ERROR : 
         Log.i("GetJSONArray", "NETWORK_ERROR"); 
         // TODO Create Alert Dialog 
        case AjaxStatus.AUTH_ERROR : 
         Log.i("GetJSONArray", "AUTH_ERROR"); 
         break; 
       } 
      } 
     }); 

    } 
} 

답변

1

당신은 당신이 c 또는 context의 값을 할당하지 코드를 생략하지 않는.

당신은 항상 null가됩니다 "C"를 전달하는

SimpleAdapter adapter = new SimpleAdapter(c, mList, R.layout.list_item, from, to); 

를 호출.

getActivity()로 전환 "C"와 문제는

final AQuery aq = new AQuery(c); 

당신이 당신이 getActivity에 액세스 할 수 알면()를 초기화한다 멀리

Additionaly 가야한다. 프래그먼트가 작성되면 attach (..)가 호출 될 때까지 즉시 액티비티에 액세스하지 않습니다.

관련 문제