도움이 필요합니다! 필자는 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() 메서드에서 처리했습니다. 동일한 결과 ... 도와주세요.
내 ConnectionActivity의 ListActivity에서 확장됩니다. 그리고 안드로이드 : id = "@ + id/list"가있는 ListView가 하나만있는 레이아웃이 있습니다. 그래서 자동으로 정의하고 이전에 말했듯이 JSON 데이터가 성공적으로 배치됩니다 ... 또한 listView = ListView) findViewById (R.id.list); 그리고 그 후에 만 사용하십시오 listView.setOnItemClickListener (new ListClickListener()); –
예, runonUiThread 없이는 아무 문제없이 작동합니다. –
예, ConnectionActivity에서 ListActivity가 아닌 Activity를 확장하고 setContentView() 메소드를 사용하여 문제가 해결되었습니다. –