0

这是我在这个网站上的第一个问题,我也是 Android 新手。我正在使用在线 API 创建应用程序。我正在使用 XML 中的这个 API 并将响应解析为 ListViews。我已经到了一个地步,我想从一个活动中的 ListView 中选择一个项目,并将该信息与另一个包含所选项目更多信息的 ListView 一起发送到下一个活动。例如,一个活动有一个乐队列表。单击乐队名称将显示乐队名称和下一个活动的巡演日期列表。根据我的 API,需要乐队的 ID 号才能访问乐队巡演信息,我试图将 ID 号作为搜索参数传递,但无法使其正常工作。我确实设法在 androidhive.info 上找到了一个不错的教程,但似乎无法应用这些技术。

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

我的 AsyncDownload 类在我的 onClickListener 中被调用。该类调用包含 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 字段中获取搜索查询有什么不同?我不认为会有很大的不同。我试图包含受影响的代码。我不确定我应该提供多少代码。

4

2 回答 2

0

你可以试试这个:步骤 1. Intent in = new Intent(getApplicationContext(), SingleArtistActivity.class); in.putExtra(KEY_DISPLAY_NAME, displayName); in.putExtra(KEY_ID, 标识); in.putExtra(KEY_ON_TOUR_UNTIL, onTourUntil);

           // new AsyncDownload().execute(identification); dont start the net request here

            startActivity(in);

步骤 2. 在第二个 Activity 的 on create() 方法中添加请求 url 方法 public class SingleArtistActivity{

       onCrete(){
        ...
      new AsyncDownload().execute(identification);

在SingleArtistActivity中,实例一个空的Adapter,调用方法:listView.setAdapter(adapter),然后视图会显示,但listview是空的,没有数据显示,但是url请求在后台工作。}

step 3:当AsyncTask返回数据时,将数据放入List数据中;然后调用adapter.notifyDataSetChanged(),listview会重新加载apapter,数据会显示在listview中

于 2013-04-22T03:15:13.837 回答
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() 中调用 new AsyncDownload().execute(identification); 并在 AsyncDownload 类的 onPostExecute 中设置适配器。像这些:

@Override
protected void onPostExecute() {
    if(pDialog != null && pDialog.showing()) {
         pDialog.dismiss();
    } 
    YourAdapter adapter = new Adapter(yourdata);
    setListAdapter(adapter);
}
于 2013-04-22T03:23:07.613 回答