2012-07-19 3 views
0

도움이 필요합니다! 필자는 JSON 형식의 데이터를 가져와 ListView에 저장하는 작업을 수행합니다. 모든 것이 잘 작동합니다. 하지만 Setonitemclicklistener를 사용하여 목록에서 클릭 한 항목을 정의하고 싶습니다. 나는 onPostExecuted() AsyncTask를 확장 내 내부 연결 클래스의 방법에서 사용하려고하지만 난 그 문제는 하나 개의 스레드의 사용과 생각 NullPoinerExceptionAsyncTask가있는 Setonitemclicklistener가 NullPointerException을 발생시킵니다.

public class ConnectionActivity extends ListActivity{ 
JsonParser jsonParser = new JsonParser(); 
private ListView listView; 
JSONArray inbox = null; 
    private ProgressDialog pDialog; 
private static final String TAG_ID = "ID"; 
private static final String TAG_NAME = "Date"; 
private static final String TAG_DATE = "Name"; 
private static final String TAG_PRICE = "Price"; 
ArrayList<HashMap<String,String>> resultList; 

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

resultList = new ArrayList<HashMap<String,String>>(); 
new Connection().execute(); 
new ListHandler().execute(); 

} 
class Connection extends AsyncTask<String,String,String> 
{ 

    @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(ConnectionActivity.this); 
      pDialog.setMessage("Не базарь и жди пока загрузиться!!!!"); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

    @Override 
    protected String doInBackground(String... args) { 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 

     // getting JSON string from URL 
     String json = jsonParser.makeHttpRequest(); 
     Log.d("Outbox JSON",json.toString()); 

     try{ 

      JSONArray jArray = new JSONArray(json); 
      for (int i=0;i<jArray.length();i++) { 
        JSONObject c = jArray.getJSONObject(i); 


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

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

        // adding each child node to HashMap key => value 
        hashmap.put(TAG_ID, id); 
        hashmap.put(TAG_NAME, name); 
        hashmap.put(TAG_DATE, date); 
        hashmap.put(TAG_PRICE, price); 

        // adding HashList to ArrayList 
        resultList.add(hashmap); 

      } 

     } 
     catch(JSONException e){ 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
     } 
     return null; 
    } 
    protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting all products 
      pDialog.dismiss(); 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */ 
        ListAdapter adapter = new SimpleAdapter(
          ConnectionActivity.this, resultList, 
          R.layout.connect_item, new String[] { TAG_ID, TAG_NAME, TAG_DATE, TAG_PRICE }, 
          new int[] { R.id.order_id, R.id.order_date, R.id.order_name, R.id.order_price }); 
        // updating listview 
        setListAdapter(adapter); 
        listView = (ListView) findViewById(R.id.list); 
        listView.setOnItemClickListener(new ListClickListener()); 
       } 
      }); 

     } 
} 

있어, 그래서 생성 한 내부 이상 이처럼 내 ConnectionActivity의 클래스^

class ListHandler extends AsyncTask<Void,Void,Void> 
    { 
     protected void onPreExecute() 
     { 


     } 
     @Override 
     protected Void doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     protected void onPostExecute() 
     { 
      listView = (ListView) findViewById(R.id.list); 

      listView.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> adapter, View view, int position, long arg) { 
       Log.d("Click on the item","!!!!!!!!!!!!!!!!!!!!!"); 
       Toast toast = Toast.makeText(getApplicationContext(), 
         "Пора покормить кота!", Toast.LENGTH_SHORT); 
        toast.show(); 
      } 
     }); 


     } 


    } 

그러나 그것은 작동하지 않습니다. 나는 항목을 클릭했을 때 토스트를 얻을 수 없다는 것을 의미하지만 예외는 없습니다. Activity의 void onResume() 메소드에서 setonitemclicklistener를 처리하려고 시도했지만 NullPointerException이 발생했습니다. 또한 ListHandler 클래스의 OnPreExecute() 메서드에서 처리했습니다. 동일한 결과 ... 도와주세요.

답변

0

setContentView(R.layout.yourxml)은 어디입니까? 나는 당신이 oncreate Method에서 그것을 잊었다 고 생각합니다.

그래서 listView is null and gives NPE.

onPostExecute method have runonUiThread,Remove it no need it. 그것의 이미 UI 스레드에서 실행됩니다.

+0

내 ConnectionActivity의 ListActivity에서 확장됩니다. 그리고 안드로이드 : id = "@ + id/list"가있는 ListView가 하나만있는 레이아웃이 있습니다. 그래서 자동으로 정의하고 이전에 말했듯이 JSON 데이터가 성공적으로 배치됩니다 ... 또한 listView = ListView) findViewById (R.id.list); 그리고 그 후에 만 ​​사용하십시오 listView.setOnItemClickListener (new ListClickListener()); –

+0

예, runonUiThread 없이는 아무 문제없이 작동합니다. –

+0

예, ConnectionActivity에서 ListActivity가 아닌 Activity를 확장하고 setContentView() 메소드를 사용하여 문제가 해결되었습니다. –

0

문제는 ListActivity 대신 Activity에서 확장하고 setContentView()를 사용하여 해결되었습니다.

관련 문제