1

私はリストビューに取り組んでいます。アイテムをクリックすると、2つのオプションを含むアラートダイアログが表示されます。オプションを選択すると、リストビューに戻り、別の選択で再度実行できます。何らかの理由で、アイテムをクリックした後、ポジティブボタン(コードが含まれているボタン)をクリックしてから別のアイテムをクリックしようとすると、アラートダイアログがポップアップしません。なぜこれが起こるのか誰かが知っていますか?コードは以下のとおりです。

protected void onListItemClick(ListView l, View v, int position, long id) {
        final int i = position;
        try {
            new AlertDialog.Builder(this)
            .setTitle("Download")
            .setMessage("You have selected the level " + jArray.getJSONObject(i).getString("level_name") + ". Would you like to save it?")
            .setPositiveButton("Save", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int which) {
                    try {
                        saveLevel(jArray.getJSONObject(i).getString("level_name"),jArray.getJSONObject(i).getInt("id"));
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    return;
                } 
            })
            .setNegativeButton("Cancel",new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int which) {
                    return;
                } 
            })
            .show();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        super.onListItemClick(l, v, position, id);
    }

他に何か情報が必要な場合はお知らせください。前もって感謝します!

ウィリアム

編集

私が言えることから、それはsaveLevel関数で起こっています、私はそれを以下に投稿しています

public void saveLevel(String i, int id)
{
    InputStream is = null;
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("uid","demo"));
    String result = "";
    try
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("www.example.com/stuff.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();

        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();

        result=sb.toString();
        jArray = new JSONArray(result);
        File exst = Environment.getExternalStorageDirectory();
        String exstPath = exst.getPath();

        File filePath = new File(exstPath+"/Platformer/Downloaded");
        boolean success = filePath.mkdir();
        String path = filePath.getAbsolutePath() + "/" + i + ".xml";
        File newxmlfile = new File(path);
        try 
        {
            newxmlfile.createNewFile();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();

        }
        FileOutputStream fileos = null;        
        try
        {
            fileos = new FileOutputStream(newxmlfile);
        }
        catch(FileNotFoundException e)
        {
            Log.e("FileNotFoundException", "can't create FileOutputStream");
            return;
        }
        OutputStreamWriter output = new OutputStreamWriter(fileos);
        output.write(jArray.getJSONObject(0).getString("level_data"));
        output.flush();
        output.close();
    }
    catch(Exception e)
    {
        Log.e("log_tag", "Error parsing data "+e.toString());
    }
}
4

1 に答える 1

2

あなたのsaveLevel()関数は、UI スレッドには適していない多くのこと (ネットワーク アクセス、ファイル アクセス) を行います。AsyncTaskできれば( tutorial )を使用して、これらをバックグラウンド スレッドに分離する必要があります。

おそらく、saveLevel()別のリスト項目をクリックしようとしているときに、プログラムがまだスタックしている可能性があります。この仮定が本当に正しいかどうかを確認したい場合はreturn;、最初に行をsaveLevel()追加して、ダイアログ ボックスが意図したとおりにポップアップするかどうかを確認してください。

于 2012-11-24T03:06:49.667 に答える