需要你的幫助! 我有活動,在那裏我得到一些JSON格式的數據,並把它ListView。一切正常。但是我想用Setonitemclicklistener來定義在列表中點擊了哪個項目。我試着在onPostExecuted()我內心的Connection類,它擴展的AsyncTask的方法來使用它,但我有NullPoinerExceptionSetonitemclicklistener與AsyncTask給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()方法中處理了這個問題 - 相同的結果... 幫助請用它...
我在我的ConnectionActivity中從ListActivity擴展。而且我只有一個使用android:id =「@ + id/list」的ListView的佈局,所以它自動定義,正如我之前所說的,JSON數據正在成功放入它中...我也使用listView =( ListView)findViewById(R.id.list);並且只有在那之後使用listView.setOnItemClickListener(new ListClickListener()); – 2012-07-19 10:50:16
是的,它工作正常,沒有runonUiThread,謝謝... – 2012-07-19 10:52:24
是的,這個問題通過在我的ConnectionActivity中使用setContentView()方法擴展Activity而不是ListActivity來解決。 – 2012-07-19 11:07:30