2013-04-22 58 views
0

這是我在這個網站上的第一個問題,我也是Android的新手。我正在使用在線API創建應用程序。我正在用XML處理這個API並將響應解析成ListViews。我已經達到了希望從一個活動中的ListView中選擇一個項目並將該信息與包含所選項目的更多信息的另一個ListView一起發送到下一個活動的點。舉個例子,一個活動有一個樂隊列表。點擊樂隊名稱將顯示樂隊名稱和下一次活動的巡演日期列表。根據我的API,樂隊的ID號碼是需要訪問樂隊巡迴信息,我試圖通過身份證號碼作爲搜索參數,但不能讓這個工作。我確實設法在androidhive.info上找到一個體面的教程,但似乎無法應用這些技術。 doInBackground()方法是我的應用程序掛起的位置。Android - 如何使用嵌套ListViews

 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字段獲取搜索查詢有什麼不同?我不認爲會有很大的區別。我試圖包含受影響的代碼。我不確定我應該提供多少代碼。

回答

0

你可以試試這個: 第1步。Intent in = new Intent(getApplicationContext(),SingleArtistActivity.class); in.putExtra(KEY_DISPLAY_NAME,displayName); in.putExtra(KEY_DISPLAY_NAME,displayName); in.putExtra(KEY_ID,identification); 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. 穿上請求URL方法在第二活動的上create()方法 公共類SingleArtistActivity {

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

}在SingleArtistActivity ,例如一空適配器,呼叫的方法:LISTVIEW .setAdapter(適配器),然後視圖將顯示,但列表視圖是空的,沒有數據將顯示,但url請求在後臺工作。 }

第3步: 當AsyncTask返回數據時,把數據放入List數據中; 然後調用adapter.notifyDataSetChanged() 列表視圖將再次重裝apapter,該數據將顯示在列表視圖

+0

何時會分配「標識」?這就是爲什麼我在第一次活動中保留這個聲明。 – user2305700 2013-04-22 04:54:02

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。 like these:

@Override 
protected void onPostExecute() { 
    if(pDialog != null && pDialog.showing()) { 
     pDialog.dismiss(); 
    } 
    YourAdapter adapter = new Adapter(yourdata); 
    setListAdapter(adapter); 
}