Android - 如何使用嵌套的ListViews

时间:2013-04-22 02:19:07

标签: android xml api listview nested

这是我在这个网站上的第一个问题,我也是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字段获取搜索查询有何不同?我不认为会有太大的不同。我试图包含受影响的代码。我不确定我应该提供多少代码。

2 个答案:

答案 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);
}