0

君の力が必要!!!JSON形式のデータを取得してListViewに配置するアクティビティがあります。すべて正常に動作します。しかし、Setonitemclicklistener を使用して、リスト内でクリックされた項目を定義したいと考えています。AsyncTask を拡張する内部の Connection クラスの onPostExecuted() メソッドで使用しようとしましたが、NullPoinerException が発生しました

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());
                }
            });

        }
}

問題は 1 つのスレッドの使用にあると思うので、このように ConnectionActivity にもう 1 つの内部クラスを作成しました ^

 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() メソッドで処理しました - 同じ結果です...助けてください...

4

2 に答える 2

0

ListActivity の代わりに Activity から拡張し、setContentView() を使用することで解決された問題。

于 2012-08-14T08:07:10.693 に答える
0

はどこsetContentView(R.layout.yourxml)ですか?oncreate メソッドで忘れたと思います。

だからあなたのlistView is null and gives NPE.

onPostExecute method have runonUiThread,Remove it no need it.既に UI スレッドで実行されています。

于 2012-07-19T10:31:44.907 に答える