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

ここに間違いがあると思います:

            // 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 で setAdapter を実行します。次のように:

@Override
protected void onPostExecute() {
    if(pDialog != null && pDialog.showing()) {
         pDialog.dismiss();
    } 
    YourAdapter adapter = new Adapter(yourdata);
    setListAdapter(adapter);
}
于 2013-04-22T03:23:07.613 に答える
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. create() メソッドの 2 番目のアクティビティにリクエスト URL メソッドを配置 public class SingleArtistActivity{

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

} SingleArtistActivity で、空のアダプタをインスタンス化し、次のメソッドを呼び出します: listView.setAdapter(adapter)、ビューは表示されますが、リストビューは空で、データは表示されませんが、URL リクエストはバックグラウンドで動作しています。}

ステップ 3: AsyncTask が data を返したら、データを List data に入れます。次に、adapter.notifyDataSetChanged() を呼び出します。リストビューはアダプターを再度リロードし、データはリストビューに表示されます。

于 2013-04-22T03:15:13.837 に答える