这是我在这个网站上的第一个问题,我也是Android新手。我正在使用在线API创建应用程序。我正在使用XML中的这个API并将响应解析为ListViews。我已达到一个点,我想在一个活动中从ListView中选择一个项目,并将该信息与另一个包含所选项目的更多信息的ListView一起发送到下一个活动。例如,一个活动有一个乐队列表。单击乐队名称将显示乐队名称和下一个活动的旅行日期列表。根据我的API,需要乐队的ID号来访问乐队巡演信息我试图将ID号作为搜索参数传递但是无法使其工作。我确实设法在androidhive.info上找到了一个不错的教程,但似乎无法应用这些技术。 doInBackground()方法是我的应用程序挂起的地方。
ListView lv = getListView();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String displayName = ((TextView) view.findViewById(R.id.tvDisplayName)).getText().toString();
String onTourUntil = ((TextView) view.findViewById(R.id.tvOnTourUntil)).getText().toString();
String identification = ((TextView) view.findViewById(R.id.tvId)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleArtistActivity.class);
in.putExtra(KEY_DISPLAY_NAME, displayName);
in.putExtra(KEY_ID, identification);
in.putExtra(KEY_ON_TOUR_UNTIL, onTourUntil);
new AsyncDownload().execute(identification);
startActivity(in);
}
});
}
private class AsyncDownload extends AsyncTask<String, String, String> {
ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(ArtistsSearchActivity.this);
pDialog.setMessage("Please Wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... params) {
Log.v(TAG, "query is" + params[0]);
String result = new ArtistCalendarHelper().getXml(params[0]);
return result;
}
我的onClickListener中调用了我的AsyncDownload类。该类调用包含URL和API密钥的帮助程序。
public class ArtistCalendarHelper {
private static final String TAG = "ArtistCalendarHelper";
private static final String SONGKICK_URL = "http://api.songkick.com/api/3.0/artists/";
private static final String API_KEY = "yIekMi1hQzcFheKc";
public String getXml(String identification) {
HttpClient httpclient = new DefaultHttpClient();
String getParameters = "";
try {
getParameters = URLEncoder.encode(identification, "UTF-8")
+ "/calendar.xml?apikey=" + URLEncoder.encode(API_KEY, "UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String url = SONGKICK_URL + getParameters;
// Prepare a request object
HttpGet httpget = new HttpGet(url);
// Execute the request
HttpResponse response;
这些方法适用于在初始搜索中获取波段名称。如何更改为使用从ListView检索的参数搜索旅游信息? 这与从EditText字段获取搜索查询有何不同?我不认为会有太大的不同。我试图包含受影响的代码。我不确定我应该提供多少代码。
答案 0 :(得分:0)
你可以试试这个: 步骤1. Intent in = new Intent(getApplicationContext(),SingleArtistActivity.class); in.putExtra(KEY_DISPLAY_NAME,displayName); in.putExtra(KEY_ID,identification); in.putExtra(KEY_ON_TOUR_UNTIL,onTourUntil);
// new AsyncDownload().execute(identification); dont start the net request here
startActivity(in);
第2步。 在create()方法的第二个Activity中提出请求url方法 公共类SingleArtistActivity {
onCrete(){
...
new AsyncDownload().execute(identification);
} 在SingleArtistActivity中,实例为空适配器,调用方法:listView.setAdapter(适配器),然后视图将显示但listview为空,没有数据显示,但url请求在后台工作。 }
第3步: 当AsyncTask返回数据时,将数据放入List数据中; 然后调用adapter.notifyDataSetChanged() listview将重新加载apapter,数据将显示在listview
中答案 1 :(得分:0)
我认为这里有一个错误:
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleArtistActivity.class);
in.putExtra(KEY_DISPLAY_NAME, displayName);
in.putExtra(KEY_ID, identification);
in.putExtra(KEY_ON_TOUR_UNTIL, onTourUntil);
new AsyncDownload().execute(identification);
startActivity(in);
我想您希望使用AsyncDownload加载数据,然后在SingleArtistActivity.class中显示它们。 所以你应该将这些代码放在SingleArtistActivity.java中。
你应该在SingleArtistActivity.java的onCreate()或onResume()中调用新的AsyncDownload()。execute(identification); 和AsyncDownload类的onPostExecute中的setAdapter。 像这样:
@Override
protected void onPostExecute() {
if(pDialog != null && pDialog.showing()) {
pDialog.dismiss();
}
YourAdapter adapter = new Adapter(yourdata);
setListAdapter(adapter);
}