2012-11-25 3 views
1

간단한 AsyncTask 클래스를 사용하여이 stackoverflow question의 도움으로 ListView에 데이터를 표시했습니다. 그러나 AsyncTask onPostExecute가 호출되지 않습니다.AsyncTask를 사용하여 ListView에 데이터를 표시했지만 onPostExecute가 호출되지 않음

public class Start extends SherlockActivity { 

// JSON Node names 
private static final String TAG_ID = "id"; 
private static final String TAG_NAME = "name"; 


// category JSONArray 
JSONArray category = null; 

private ListView lv; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    setTheme(SampleList.THEME); //Used for theme switching in samples 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 


    new MyAsyncTask().execute("http://...."); 

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

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
      String cost = ((TextView) view.findViewById(R.id.mail)).getText().toString(); 

      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
      in.putExtra("categoryname", name); 
      System.out.println(cost); 
      in.putExtra("categoryid", cost); 
      startActivity(in); 


     } 
    }); 
} 

public class MyAsyncTask extends AsyncTask<String, Void, ArrayList<HashMap<String, String>> > { 
    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); 

    @Override 
    protected ArrayList<HashMap<String, String>> doInBackground(String... params) { 
     // Creating JSON Parser instance 
     JSONParser jParser = new JSONParser(); 
     // getting JSON string from URL 
     category = jParser.getJSONArrayFromUrl(params[0]); 
     try { 

      // looping through All Contacts 
      for(int i = 0; i < category.length(); i++){ 
       JSONObject c = category.getJSONObject(i); 

       // Storing each json item in variable 
       String id = c.getString(TAG_ID); 
       String name = c.getString(TAG_NAME); 


       // 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_NAME, name); 

       // adding HashList to ArrayList 
       contactList.add(map); 

      } 
     } catch (JSONException e) { 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 
     return contactList; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<HashMap<String, String>> result) { 
      ListAdapter adapter = new SimpleAdapter(Start.this, result , R.layout.list_item, 
        new String[] { TAG_NAME, TAG_ID }, 
        new int[] { R.id.name, R.id.mail }); 

      // selecting single ListView item 
      lv = (ListView) findViewById(R.id.ListView); 
      lv.setAdapter(adapter); 

     } 
} 
} 

이클립스 : 귀하의 ListView lv

NULL입니다

11-25 11:40:31.896: E/AndroidRuntime(917): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.essentials/de.main.Start} 

             :java.lang.NullPointerException 
+0

이전에 "lv"를 정의하지 않았기 때문에 "lv.setOnItemClickListener (new OnItemClickListener() ...") 오류가 발생합니다. – nfirex

답변

5

, 때문에

이 내 코드입니다.

당신은
lv = (ListView) findViewById(R.id.<lisview_id_from_test.xml>); 

그래서 onPostExecute()

에서 lv = (ListView) findViewById(R.id.ListView);를 제거하고 코드 라인 new MyAsyncTask().execute("http://...."); 전에 넣어, 당신이 좋아하는 뭔가를해야 setContentView(R.layout.test);

ListView lv을 정의하는 것을 잊었다.

이유 : 인 일이 실제로 무엇을

,

AsyncTask를의 onPostExecute()에 가기 전에, 코드 라인 lv.setOnItemClickListener(new OnItemClickListener() {...}이 실행되고있을 Listview lv의 목적은 NULL입니다.

+0

오, 덕분에 지금 작동합니다 :) – sumisu

관련 문제