0

私が構築しているアプリケーションでは、データベースからいくつかのデータをロードする必要があります。
ユーザーがアラート ダイアログから項目を選択すると、データが読み込まれます。クラスを使用してデータベースに接続します
AsyncTaskコードは次のとおりです。

public class GetTask extends AsyncTask<Void,Void,Void>{

        @Override
        protected Void doInBackground(Void... arg0) {
            getProdotti();
            return null;
        }

        @Override
          protected void onPostExecute(Void result) {
            pg.dismiss();  
            for(int w=0;w<all_id.length;w++){
                _id.add(all_id[w]);
                nomi.add(all_names[w]);
                foto.add(all_images[w]);
                prezzi.add(all_prices[w]);
                descr.add(all_desc[w]);
            }
            lista = (ListView)findViewById(R.id.lista_prodotti);
            ListViewAdapter lva = new ListViewAdapter(nomi , foto , prezzi , _id , descr , context);
            lista.setAdapter(lva);
          }

          protected void onPreExecute(Void result) {
              pg = ProgressDialog.show(context, "", "Caricamento in corso...");
          }

          @Override
          protected void onProgressUpdate(Void... values) {
          }



     }/**/

そして、私はそれをそう呼びます

GetTask cat = new GetTask();
cat.execute();

進行状況ダイアログが表示されますが、消えず、ListView に値が設定されていません。
私が間違っているのは何ですか?

getProdotti() は次のとおりです。

private void getProdotti(){
    try{
        httpclient = new DefaultHttpClient();
        httppost = new HttpPost(host_url);
        datas = new ArrayList<NameValuePair>(1);
        datas.add(new BasicNameValuePair("categoria",selected));

        Log.d("INVIO",selected);

        httppost.setEntity(new UrlEncodedFormEntity(datas));
        response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        inputStream = entity.getContent();

    }catch (Exception e){
        Toast.makeText(Catalogo.this, "error"+e.toString(), Toast.LENGTH_LONG).show();
    }

    if(inputStream != null){

        try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            inputStream.close();
            result = sb.toString();
            Log.d("RESULT",result);

        }catch(Exception e){
            Log.e("TEST", "Errore nel convertire il risultato "+e.toString());
            }
        try{
            JSONArray jArray = new JSONArray(result);
            all_id = new String[jArray.length()];
            all_names = new String[jArray.length()];
            all_prices = new String[jArray.length()];
            all_images = new String[jArray.length()];
            all_desc = new String[jArray.length()];
            for(int i=0;i<jArray.length();i++){
                JSONObject json_prod = jArray.getJSONObject(i);
                Log.d("Debug",json_prod.getString("id_prodotto")+"--"+json_prod.getString("nome_prodotto"));
                all_id[i]=json_prod.getString("id_prodotto");
                all_names[i]=json_prod.getString("nome_prodotto");
                all_prices[i]=json_prod.getString("prezzo");
                all_images[i]=json_prod.getString("foto_prodotto");
                all_desc[i]=json_prod.getString("descrizione");
            }
        }catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());
                }
    }

}
4

2 に答える 2

0

実際には、進行状況バーを非表示にするように指示する必要があります。アダプタをリスト呼び出しに設定した後、最初に 2 つの方法があります。

@Override
protected void onPostExecute(Void result) {
     .....
    pg.dismiss();

または、次のようなハンドラを定義するハンドラを使用できます

Handler handler = new Handler (){
 @Override
protected void handleMessage(int what){
    if(pg.isShowing()){
      pg.dismiss();
    }
}
}

そして onPostExecute メソッド呼び出しで

handler.sendEmptyMessage(0);

これは役に立ちます!!!

于 2013-05-27T12:54:16.877 に答える
0

lva.notifyDataSetChanged()次のように内部に追加してみてくださいonPostExecute:

        lista = (ListView)findViewById(R.id.lista_prodotti);
        ListViewAdapter lva = new ListViewAdapter(nomi , foto , prezzi , _id , descr , context);
        lista.setAdapter(lva);
        lva.notifyDataSetChanged();

これが役に立てば幸いです、幸運を祈ります^^

于 2013-05-27T12:41:08.320 に答える