2014-04-09 100 views
0

在我的Android應用程序中,我有一個列表視圖活動,顯示通過JSON從Web服務器下載的MySQL對象。僅在第一次打開對象時列出視圖活動

我檢測到以下問題:第一次顯示活動時,JSON對象顯示正常,但如果用戶返回上一個活動並再次打開列表視圖活動,則任何對象都顯示在列表並且不會引發錯誤。

我需要你的幫助來解決這個問題。下面是活動代碼:

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class ofertas_list extends ListActivity { 

    private ProgressDialog pDialog; 

// JSON node keys 
    private static final String TAG_NAME = "nombreCategoria"; 
    private static final String TAG_ID = "idCategoria"; 
    private static final String TAG_CATEGORIAS = "Categorias"; 

    // URL to get contacts JSON 
    private static String url = "http://xxxxxxxx/android_ofertaslist.php?id="; 





    // JSON Node names 

    private static final String TAG_NOMBREEMPRESA = "nombreEmpresa"; 
    private static final String TAG_IDEMPRESA = "idEmpresa"; 
    private static final String TAG_DESCRIPCIONEMPRESA = "descripcionEmpresa"; 
    private static final String TAG_STRIMAGEN = "strImagen"; 
    private static final String TAG_DIRECCIONEMPRESA = "direccionEmpresa"; 
    private static final String TAG_TELEFONOEMPRESA = "telefonoEmpresa"; 
    private static final String TAG_FACEBOOKEMPRESA = "facebookEmpresa"; 
    private static final String TAG_EMAILEMPRESA = "emailEmpresa"; 
    private static final String TAG_TEXTOOFERTA = "textoOferta"; 
    private static final String TAG_HORARIOEMPRESA = "horarioEmpresa"; 
    private static final String TAG_CATEGORIAEMPRESA = "categoriaEmpresa"; 
    private static final String TAG_LATITUDEMPRESA = "latitudEmpresa"; 
    private static final String TAG_LONGITUDEMPRESA = "longitudEmpresa"; 
    private static final String TAG_VALORACIONEMPRESA = "valoracionEmpresa"; 



    // contacts JSONArray 
    JSONArray contacts = null; 

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> contactList; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_categorias); 


    // getting intent data 
     Intent in = getIntent(); 
    // JSON node keys 

     // Get JSON values from previous intent 
     String name = in.getStringExtra(TAG_NAME); 
     String email = in.getStringExtra(TAG_ID); 

     // URL to get contacts JSON 
     this.url = url+email; 
     this.setTitle(name); 
     contactList = new ArrayList<HashMap<String, String>>(); 

     ListView lv = getListView(); 

     // Listview on item click listener 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting values from selected ListItem 

       //cambiar por los nuevos campos 
       String name = ((TextView) view.findViewById(R.id.name)) 
         .getText().toString(); 
       String cost = ((TextView) view.findViewById(R.id.email)) 
         .getText().toString(); 


       //Starting single contact activity 
       //cambiar por los nuevos campos 
       Intent in = new Intent(getApplicationContext(), 
         SingleContactActivity.class); 
       in.putExtra(TAG_NAME, name); 
       in.putExtra(TAG_ID, cost); 

       startActivity(in); 

      } 
     }); 

     // Calling async task to get json 
     new GetContacts().execute(); 
    } 

    /** 
    * Async task class to get json by making HTTP call 
    * */ 
    private class GetContacts extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(ofertas_list.this); 
      pDialog.setMessage("Cargando datos..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      // Creating service handler class instance 
      ServiceHandler sh = new ServiceHandler(); 

      // Making a request to url and getting response 
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 

      Log.d("Response: ", "> " + jsonStr); 

      if (jsonStr != null) { 
       try { 
        JSONObject jsonObj = new JSONObject(jsonStr); 

        // Getting JSON Array node 
        contacts = jsonObj.getJSONArray(TAG_CATEGORIAS); 

        // looping through All Contacts 
        for (int i = 0; i < contacts.length(); i++) { 
         JSONObject c = contacts.getJSONObject(i); 


         String nombreEmpresa = c.getString(TAG_NOMBREEMPRESA); 
         String descripcionEmpresa = c.getString(TAG_DESCRIPCIONEMPRESA); 
         String strImagen = c.getString(TAG_STRIMAGEN); 
         String direccionEmpresa = c.getString(TAG_DIRECCIONEMPRESA); 
         String telefonoEmpresa = c.getString(TAG_TELEFONOEMPRESA); 
         String facebookEmpresa = c.getString(TAG_FACEBOOKEMPRESA); 
         String emailEmpresa = c.getString(TAG_EMAILEMPRESA); 
         String textoOferta = c.getString(TAG_TEXTOOFERTA); 
         String horarioEmpresa = c.getString(TAG_HORARIOEMPRESA); 
         String categoriaEmpresa = c.getString(TAG_CATEGORIAEMPRESA); 
         String valoracionEmpresa = c.getString(TAG_VALORACIONEMPRESA); 
         String latitudEmpresa = c.getString(TAG_LATITUDEMPRESA); 
         String longitudEmpresa = c.getString(TAG_LONGITUDEMPRESA); 
         String idEmpresa = c.getString(TAG_IDEMPRESA); 




         // Phone node is JSON Object 

         // tmp hashmap for single contact 
         HashMap<String, String> contact = new HashMap<String, String>(); 

         // adding each child node to HashMap key => value 
         contact.put(TAG_IDEMPRESA, idEmpresa); 
         contact.put(TAG_NOMBREEMPRESA, nombreEmpresa); 
         contact.put(TAG_DESCRIPCIONEMPRESA,descripcionEmpresa); 
         contact.put(TAG_STRIMAGEN,strImagen); 
         contact.put(TAG_DIRECCIONEMPRESA,direccionEmpresa); 
         contact.put(TAG_TELEFONOEMPRESA,telefonoEmpresa); 
         contact.put(TAG_FACEBOOKEMPRESA,facebookEmpresa); 
         contact.put(TAG_EMAILEMPRESA,emailEmpresa); 
         contact.put(TAG_TEXTOOFERTA,textoOferta); 
         contact.put(TAG_HORARIOEMPRESA,horarioEmpresa); 
         contact.put(TAG_CATEGORIAEMPRESA,categoriaEmpresa); 
         contact.put(TAG_VALORACIONEMPRESA,valoracionEmpresa); 
         contact.put(TAG_LATITUDEMPRESA,latitudEmpresa); 
         contact.put(TAG_LONGITUDEMPRESA,longitudEmpresa); 






         // adding contact to contact list 
         contactList.add(contact); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       Log.e("ServiceHandler", "Couldn't get any data from the url"); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(
        ofertas_list.this, contactList, 
        R.layout.list_item_ofertas, new String[] { TAG_NOMBREEMPRESA, TAG_DIRECCIONEMPRESA}, new int[] { R.id.name, 
          R.id.email }); 

      setListAdapter(adapter); 
     } 

    } 

} 

更新的代碼:

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class ofertas_list extends ListActivity { 

    private ProgressDialog pDialog; 

// JSON node keys 
    private static final String TAG_NAME = "nombreCategoria"; 
    private static final String TAG_ID = "idCategoria"; 
    private static final String TAG_CATEGORIAS = "Categorias"; 

    // URL to get contacts JSON 
    private static String url = "http://xxxxxxx/android_ofertaslist.php?id="; 



    // URL to get contacts JSON 
    // private static String url = "http://mujercanariasigloxxi.appgestion.eu/app_php_files/android_ofertaslist.php"; 

    // JSON Node names 

    private static final String TAG_NOMBREEMPRESA = "nombreEmpresa"; 
    private static final String TAG_IDEMPRESA = "idEmpresa"; 
    private static final String TAG_DESCRIPCIONEMPRESA = "descripcionEmpresa"; 
    private static final String TAG_STRIMAGEN = "strImagen"; 
    private static final String TAG_DIRECCIONEMPRESA = "direccionEmpresa"; 
    private static final String TAG_TELEFONOEMPRESA = "telefonoEmpresa"; 
    private static final String TAG_FACEBOOKEMPRESA = "facebookEmpresa"; 
    private static final String TAG_EMAILEMPRESA = "emailEmpresa"; 
    private static final String TAG_TEXTOOFERTA = "textoOferta"; 
    private static final String TAG_HORARIOEMPRESA = "horarioEmpresa"; 
    private static final String TAG_CATEGORIAEMPRESA = "categoriaEmpresa"; 
    private static final String TAG_LATITUDEMPRESA = "latitudEmpresa"; 
    private static final String TAG_LONGITUDEMPRESA = "longitudEmpresa"; 
    private static final String TAG_VALORACIONEMPRESA = "valoracionEmpresa"; 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     new GetContacts().execute(); 
    } 


    // contacts JSONArray 
    JSONArray contacts = null; 

    // Hashmap for ListView 
    ArrayList<HashMap<String, String>> contactList; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_categorias); 


    // getting intent data 
     Intent in = getIntent(); 
    // JSON node keys 

     // Get JSON values from previous intent 
     String name = in.getStringExtra(TAG_NAME); 
     String email = in.getStringExtra(TAG_ID); 

     // URL to get contacts JSON 
     this.url = url+email; 
     this.setTitle(name); 
     contactList = new ArrayList<HashMap<String, String>>(); 

     ListView lv = getListView(); 

     // Listview on item click listener 
     lv.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // getting values from selected ListItem 

       //cambiar por los nuevos campos 
       String name = ((TextView) view.findViewById(R.id.name)) 
         .getText().toString(); 
       String cost = ((TextView) view.findViewById(R.id.email)) 
         .getText().toString(); 


       //Starting single contact activity 
       //cambiar por los nuevos campos 
       Intent in = new Intent(getApplicationContext(), 
         SingleContactActivity.class); 
       in.putExtra(TAG_NAME, name); 
       in.putExtra(TAG_ID, cost); 

       startActivity(in); 

      } 
     }); 

     // Calling async task to get json 
     new GetContacts().execute(); 
    } 

    /** 
    * Async task class to get json by making HTTP call 
    * */ 
    private class GetContacts extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      pDialog = new ProgressDialog(ofertas_list.this); 
      pDialog.setMessage("Cargando datos..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      // Creating service handler class instance 
      ServiceHandler sh = new ServiceHandler(); 

      // Making a request to url and getting response 
      String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET); 

      Log.d("Response: ", "> " + jsonStr); 

      if (jsonStr != null) { 
       try { 
        JSONObject jsonObj = new JSONObject(jsonStr); 

        // Getting JSON Array node 
        contacts = jsonObj.getJSONArray(TAG_CATEGORIAS); 

        // looping through All Contacts 
        for (int i = 0; i < contacts.length(); i++) { 
         JSONObject c = contacts.getJSONObject(i); 


         String nombreEmpresa = c.getString(TAG_NOMBREEMPRESA); 
         String descripcionEmpresa = c.getString(TAG_DESCRIPCIONEMPRESA); 
         String strImagen = c.getString(TAG_STRIMAGEN); 
         String direccionEmpresa = c.getString(TAG_DIRECCIONEMPRESA); 
         String telefonoEmpresa = c.getString(TAG_TELEFONOEMPRESA); 
         String facebookEmpresa = c.getString(TAG_FACEBOOKEMPRESA); 
         String emailEmpresa = c.getString(TAG_EMAILEMPRESA); 
         String textoOferta = c.getString(TAG_TEXTOOFERTA); 
         String horarioEmpresa = c.getString(TAG_HORARIOEMPRESA); 
         String categoriaEmpresa = c.getString(TAG_CATEGORIAEMPRESA); 
         String valoracionEmpresa = c.getString(TAG_VALORACIONEMPRESA); 
         String latitudEmpresa = c.getString(TAG_LATITUDEMPRESA); 
         String longitudEmpresa = c.getString(TAG_LONGITUDEMPRESA); 
         String idEmpresa = c.getString(TAG_IDEMPRESA); 




         // Phone node is JSON Object 

         // tmp hashmap for single contact 
         HashMap<String, String> contact = new HashMap<String, String>(); 

         // adding each child node to HashMap key => value 
         contact.put(TAG_IDEMPRESA, idEmpresa); 
         contact.put(TAG_NOMBREEMPRESA, nombreEmpresa); 
         contact.put(TAG_DESCRIPCIONEMPRESA,descripcionEmpresa); 
         contact.put(TAG_STRIMAGEN,strImagen); 
         contact.put(TAG_DIRECCIONEMPRESA,direccionEmpresa); 
         contact.put(TAG_TELEFONOEMPRESA,telefonoEmpresa); 
         contact.put(TAG_FACEBOOKEMPRESA,facebookEmpresa); 
         contact.put(TAG_EMAILEMPRESA,emailEmpresa); 
         contact.put(TAG_TEXTOOFERTA,textoOferta); 
         contact.put(TAG_HORARIOEMPRESA,horarioEmpresa); 
         contact.put(TAG_CATEGORIAEMPRESA,categoriaEmpresa); 
         contact.put(TAG_VALORACIONEMPRESA,valoracionEmpresa); 
         contact.put(TAG_LATITUDEMPRESA,latitudEmpresa); 
         contact.put(TAG_LONGITUDEMPRESA,longitudEmpresa); 






         // adding contact to contact list 
         contactList.add(contact); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       Log.e("ServiceHandler", "Couldn't get any data from the url"); 
      } 

      return null; 
     } 



     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      if (pDialog.isShowing()) 
       pDialog.dismiss(); 
      /** 
      * Updating parsed JSON data into ListView 
      * */ 
      ListAdapter adapter = new SimpleAdapter(
        ofertas_list.this, contactList, 
        R.layout.list_item_ofertas, new String[] { TAG_NOMBREEMPRESA, TAG_DIRECCIONEMPRESA}, new int[] { R.id.name, 
          R.id.email }); 

      setListAdapter(adapter); 
     } 

    } 

} 

回答

1

new GetContacts().execute()寫入onResume()方法。

onCreate()在首次啓動Activity時調用。如果你離開活動,不殺死它,然後回來,你的應用程序會突破onStart() ->的onResume()`

onResumeonCreate前面,並從onCreate()刪除new GetContacts().execute();

... 
// Hashmap for ListView 
ArrayList<HashMap<String, String>> contactList; 

@Override 
public void onResume(){ 
    super.onResume(); 
    new GetContacts().execute(); 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_categorias); 
... 
+0

謝謝,我已將以下內容添加到我的活動中:protected void onResume() { \t new GetContacts()。execute(); }但問題沒有解決。 – mvasco

+0

您無法使其保護,您將覆蓋現有的方法。我會更新我的答案 –

+0

看來你加入了AsynTask。你能更新你的代碼嗎? –

2

你或許應該在onResume()執行 「new GetContacts().execute();」 電話。查看Android documentation以更熟悉Android活動生命週期。

onCreate()僅在創建活動時調用。在你的測試中,Activity可能通常仍然存在,所以在重新進入Activity時並不總是調用onCreate()。

+0

謝謝你,我已經包含在我的活動如下:保護無效的onResume(){ \t新GetContacts()執行(); }但問題沒有解決。 – mvasco

相關問題