Autore Topic: Convertire ListActivity in ListFragment  (Letto 743 volte)

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Convertire ListActivity in ListFragment
« il: 10 Marzo 2014, 19:25:42 CET »
0
Salve a tutti, mi sono appena iscritto perchè mi sto affacciando alla programmazione Android da poche settimane e ho delle difficoltà.
Sto cercando di realizzare un app di una piattaforma internet che sto sviluppando io stesso per una società per la quale lavoro.
Il sito è scritto in PHP e si appoggia ad un database MySQL.

Spinto dalla curiosità sto cercando di vedere come provare a realizzare la relative applicazione Android.

Sto iniziando da poco tempo e ho chiaramente delle difficoltà.

Leggendo vari tutorial per la rete sono riuscito a fare alcune cose, ma quando si tratta di mettere insieme vari tutorial lì iniziano le difficoltà.

In particolare oggi ho provato a sperimentare la visualizzazione con TAB con i Fragment, e ho optato per la libreria modificata di Sherlock per la comptabilità con dispositivi inferiori alla 4.0.

La libreria funziona, e la navigazione in Tab funziona bene, ho creato 5 TAB e con dei valori statici non ci sono problemi.

Il problema che invece che avere una lista normale, vorrei prelevare i valori dal database MySQL che ho sia in locale che su un server.

Prima di fare questi esperimenti avevo già realizzato un Activity che sfruttava ListActivity per prelevare i dati dal Server.

Per fare questo utilizzavo una classe già fatta chiamata JSONParser, e avevo messo nel mio pc un file php che eseguiva una SELECT nel database, e restituiva il risultato in formato JSON che poi veniva parsato dall'applicazione Android.

Anche questo funzionava, riuscivo a ottenere una lista di quello che m'interessava, ora però ho difficoltà nell'integrare queste 2 cose in un unica activity perchè il ListActivity non posso usarlo se sto dentro un Fragment, perchè lui si aspetta un ListFragment, che però da molti errori perchè non ha le stesse funzioni del ListActivity.

Vi posto qualche parte di codice per farvi capire meglio.

Codice: [Seleziona]
PlantsFragment.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
 
import org.apache.http.NameValuePair;
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 PlantsFragment extends ListActivity {
 
    // Progress Dialog
    private ProgressDialog pDialog;
 
    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();
 
    ArrayList<HashMap<String, String>> plantsList;
 
    // url to get all plants list
    private static String url_all_plants = "http://192.168.0.8/test/telegea/get_all_plants.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PLANTS = "plants";
    private static final String TAG_PID = "id";
    private static final String TAG_NAME = "name";
 
    // plants JSONArray
    JSONArray plants = null;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_plants);
 
        // Hashmap for ListView
        plantsList = new ArrayList<HashMap<String, String>>();
 
        // Loading plants in Background Thread
        new LoadAllPlants().execute();
 
        // Get listview
        ListView lv = getListView();
 
        // on seleting single plant
        // launching Edit Plant Screen
        lv.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText()
                        .toString();
 
                // Starting new intent
                Intent in = new Intent(getApplicationContext(),
                        EditPlantActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, pid);
 
                // starting new activity and expecting some response back
                startActivityForResult(in, 100);
            }
        });
 
    }
 
    // Response from Edit Plant Activity
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // if result code 100
        if (resultCode == 100) {
            // if result code 100 is received
            // means user edited/deleted plant
            // reload this screen again
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }
 
    }
 
    /**
     * Background Async Task to Load all plant by making HTTP Request
     * */
    class LoadAllPlants extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(PlantsFragment.this);
            pDialog.setMessage("Loading plants. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
 
        /**
         * getting All plants from url
         * */
        protected String doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_plants, "GET", params);
 
            // Check your log cat for JSON reponse
            Log.d("All Plants: ", json.toString());
 
            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // plants found
                    // Getting Array of Plants
                    plants = json.getJSONArray(TAG_PLANTS);
 
                    // looping through All Plants
                    for (int i = 0; i < plants.length(); i++) {
                        JSONObject c = plants.getJSONObject(i);
 
                        // Storing each json item in variable
                        String id = c.getString(TAG_PID);
                        String name = c.getString(TAG_NAME);
 
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
 
                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, id);
                        map.put(TAG_NAME, name);
 
                        // adding HashList to ArrayList
                        plantsList.add(map);
                    }
                } else {
                    // no plants found
                    // Launch Add New plant Activity
                    Intent i = new Intent(getApplicationContext(),
                            NewPlantActivity.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all plants
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            PlantsFragment.this, plantsList,
                            R.layout.list_item, new String[] { TAG_PID,
                                    TAG_NAME},
                            new int[] { R.id.pid, R.id.name });
                    // updating listview
                    setListAdapter(adapter);
                }
            });
 
        }
 
    }
}

Questa parte non da errori così com'è, ma l'errore ci sta in un altra classe che richiama i vari Fragment, perchè lui vuole che siano di tipo Fragment per funzionare

Codice: [Seleziona]
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
 
public class TabsPagerAdapter extends FragmentPagerAdapter {
 
    public TabsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
 
    @Override
    public Fragment getItem(int index) {
 
        switch (index) {
        case 0:
            // Plants fragment activity
            return new PlantsFragment();
        case 1:
            // Users fragment activity
            return new UsersFragment();
        case 2:
            // Groups fragment activity
            return new GroupsFragment();
        case 3:
            // Loggers fragment activity
            return new LoggersFragment();
        case 4:
            // Profile fragment activity
            return new ProfileFragment();
        }
 
        return null;
    }
 
    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 5;
    }
 
}

Errore nel case 0 perchè la classe richiamata deve essere di tipo Fragment, però il codice postato in precedenza non lo è, e il problema è proprio che non so come modificarlo con il ListFragment, perchè dava errori in molte parti di codice, come ad esempio setContentView, getApplicationContext, onActivityResult, getIntent, finish, nel pDialog =  new ProgressDialog e nel SimpleAdapter.

In una prova precedente avevo provato questo codice, ma è con valori statici, e non mi serve, devo prenderli dal database:

Codice: [Seleziona]
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
import com.actionbarsherlock.app.SherlockListFragment;
 
public class AndroidFragment extends SherlockListFragment{
 
    /** An array of items to display in ArrayList */
    String android_versions[] = new String[]{
        "Jelly Bean",
        "IceCream Sandwich",
        "HoneyComb",
        "Ginger Bread",
        "Froyo"
    };
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        /** Creating array adapter to set data in listview */
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity().getBaseContext(), android.R.layout.simple_list_item_multiple_choice, android_versions);
 
        /** Setting the array adapter to the listview */
        setListAdapter(adapter);
 
        return super.onCreateView(inflater, container, savedInstanceState);
    }
 
    @Override
    public void onStart() {
        super.onStart();
        /** Setting the multiselect choice mode for the listview */
        getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    }
}

Per chiunque di voi mi sappia aiutare le sarei molto grato, sto cercando d'imparare e sono alle primissime armi.

Grazie

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Convertire ListActivity in ListFragment
« Risposta #1 il: 13 Marzo 2014, 09:48:37 CET »
+1
Ciao,
ti posto il codice della tua ListActivity convertita in un ListFragment, dovrebbe compilare.
Nota bene che ho semplicemente cercato di far compilare il tuo codice, cercando di mantenere la logica della tua Activity e spostandola in un Fragment, non so se funzionerà come ti aspetti o se questo sia il modo migliore di riprogettare l'applicazione in modo che sia orientata ai Fragment nel caso specifico.
Spero ti possa aiutare almeno un po' !

Codice (Java): [Seleziona]
package com.example.training;

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

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
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 PlantsFragment extends ListFragment {
 
    // Progress Dialog
    private ProgressDialog pDialog;
 
    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();
 
    ArrayList<HashMap<String, String>> plantsList;
 
    // url to get all plants list
    private static String url_all_plants = "http://192.168.0.8/test/telegea/get_all_plants.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PLANTS = "plants";
    private static final String TAG_PID = "id";
    private static final String TAG_NAME = "name";
 
    // plants JSONArray
    JSONArray plants = null;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_plants);
 
        // Hashmap for ListView
        plantsList = new ArrayList<HashMap<String, String>>();
 
        // Loading plants in Background Thread
        new LoadAllPlants().execute();
 
        // Get listview
        ListView lv = getListView();
 
        // on seleting single plant
        // launching Edit Plant Screen
        lv.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText()
                        .toString();
 
                // Starting new intent
                Intent in = new Intent(getActivity(),
                        EditPlantActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, pid);
 
                // starting new activity and expecting some response back
                startActivityForResult(in, 100);
            }
        });
 
    }
 
    // Response from Edit Plant Activity
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // if result code 100
        if (resultCode == 100) {
            // if result code 100 is received
            // means user edited/deleted plant
            // reload this screen again
            Intent intent = getIntent();
           
         /*
          *  Cosa vuoi che succeda qui?
          *  Vuoi che si chiuda l'activity che contiene le tabs o che cambi il fragment correntemente
          *  visualizzato?
          *
          *  Nel caso in cui tu voglia chiudere l'activity devi fare getActivity().finish();
          *  
          */

//            finish();  
           
            startActivity(intent);
        }
 
    }
 
    /**
     * Background Async Task to Load all plant by making HTTP Request
     * */

    class LoadAllPlants extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Loading plants. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
 
        /**
         * getting All plants from url
         * */

        protected String doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_plants, "GET", params);
 
            // Check your log cat for JSON reponse
            Log.d("All Plants: ", json.toString());
 
            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // plants found
                    // Getting Array of Plants
                    plants = json.getJSONArray(TAG_PLANTS);
 
                    // looping through All Plants
                    for (int i = 0; i < plants.length(); i++) {
                        JSONObject c = plants.getJSONObject(i);
 
                        // Storing each json item in variable
                        String id = c.getString(TAG_PID);
                        String name = c.getString(TAG_NAME);
 
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
 
                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, id);
                        map.put(TAG_NAME, name);
 
                        // adding HashList to ArrayList
                        plantsList.add(map);
                    }
                } else {
                    // no plants found
                    // Launch Add New plant Activity
                    Intent i = new Intent(getActivity(),
                            NewPlantActivity.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/

        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all plants
            pDialog.dismiss();
            // updating UI from Background Thread
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */

                    ListAdapter adapter = new SimpleAdapter(
                            PlantsFragment.this, plantsList,
                            R.layout.list_item, new String[] { TAG_PID,
                                    TAG_NAME},
                            new int[] { R.id.pid, R.id.name });
                    // updating listview
                    setListAdapter(adapter);
                }
            });
 
        }
 
    }
}

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Convertire ListActivity in ListFragment
« Risposta #2 il: 13 Marzo 2014, 10:58:41 CET »
0
Mi sembra avevo provato a fare qualche modifica simile e dava degli errori, però ora riprovo a fare queste modifiche come mi hai detto e in caso ti posto il logcat.

Grazie comunque della risposta!

Marco

Post unito: 13 Marzo 2014, 11:53:06 CET
Niente, con il tuo codice da ancora degli errori di codice che ora ti posterò:

Codice: [Seleziona]
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_plants);
 
        // Hashmap for ListView
        plantsList = new ArrayList<HashMap<String, String>>();
 
        // Loading plants in Background Thread
        new LoadAllPlants().execute();
 
        // Get listview
        ListView lv = getListView();
 
        // on seleting single plant
        // launching Edit Plant Screen
        lv.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText()
                        .toString();
 
                // Starting new intent
                Intent in = new Intent(getActivity(),
                        EditPlantActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, pid);
 
                // starting new activity and expecting some response back
                startActivityForResult(in, 100);
            }
        });
 
    }

In questo metodo da errore esattamente sul
Codice: [Seleziona]
[b]setContentView[/b](R.layout.fragment_plants);
Dopo da un errore anche nel metodo successivo

Codice: [Seleziona]
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // if result code 100
        if (resultCode == 100) {
            // if result code 100 is received
            // means user edited/deleted plant
            // reload this screen again
            Intent intent = getIntent();
           
         /*
          *  Cosa vuoi che succeda qui?
          *  Vuoi che si chiuda l'activity che contiene le tabs o che cambi il fragment correntemente
          *  visualizzato?
          *
          *  Nel caso in cui tu voglia chiudere l'activity devi fare getActivity().finish();
          * 
          */
//            finish(); 
           
            startActivity(intent);
        }
 
    }

Esattamente sul
Codice: [Seleziona]
Intent intent = [b]getIntent();[/b]
Infine sul postExecute:

Codice: [Seleziona]
protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all plants
            pDialog.dismiss();
            // updating UI from Background Thread
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */
                    ListAdapter adapter = new SimpleAdapter(
                            PlantsFragment.this, plantsList,
                            R.layout.list_item, new String[] { TAG_PID,
                                    TAG_NAME},
                            new int[] { R.id.pid, R.id.name });
                    // updating listview
                    setListAdapter(adapter);
                }
            });
 
        }

Da errore in questa porzione di codice sul SimpleAdapter:

Codice: [Seleziona]
ListAdapter adapter = [b]new SimpleAdapter(
                            PlantsFragment.this, plantsList,
                            R.layout.list_item, new String[] { TAG_PID,
                                    TAG_NAME},
                            new int[] { R.id.pid, R.id.name });[/b]

Spero qualcuno mi possa aiutare, sennò abbandonerò il tutto e mi metterò a studiare da zero android e riprenderò il discorso quando sarò più preparato.
Uno studio di android con un buon libro fra l'altro l'ho già programmato a priori.

Marco
« Ultima modifica: 13 Marzo 2014, 11:53:06 CET da marco_88, Reason: Merged DoublePost »

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Convertire ListActivity in ListFragment
« Risposta #3 il: 13 Marzo 2014, 14:24:02 CET »
+1
Sì, scusami, hai ragione, ho fatto di fretta e ho tralasciato alcune cose. Tra un po' lo correggo.
In ogni caso la maggiorparte degli errori di compilazione era dovuto al fatto che vengono richiamati metodi che appartengono alla classe Activity, quindi in questi casi basta ottenere il riferimento all'activity che contiene il Fragment, tramite "getActivity()".
Ad esempio :
Codice (Java): [Seleziona]
Intent intent = getIntent();
dovrebbe diventare :

Codice (Java): [Seleziona]
 Intent intent = getActivity().getIntent();
Comunque tra poco cerco di correggere l'intero codice.

Post unito: 13 Marzo 2014, 14:33:04 CET
Così dovrebbe andare, in ogni caso fammi sapere se hai ancora errori. Purtroppo non posso controllare io stesso se funziona.
Scusa se non sono preciso ma in questo momento sono un po' incasinato, spero di poterti aiutare lo stesso.

Codice (Java): [Seleziona]
package com.example.training;

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

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.cobra.cobrainstallatori.R;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
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 PlantsFragment extends ListFragment {
 
    // Progress Dialog
    private ProgressDialog pDialog;
 
    // Creating JSON Parser object
    JSONParser jParser = new JSONParser();
 
    ArrayList<HashMap<String, String>> plantsList;
 
    // url to get all plants list
    private static String url_all_plants = "http://192.168.0.8/test/telegea/get_all_plants.php";
 
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PLANTS = "plants";
    private static final String TAG_PID = "id";
    private static final String TAG_NAME = "name";
 
    // plants JSONArray
    JSONArray plants = null;
 
   
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
               
                View mainView = inflater.inflate(R.layout.fragment_plants, container, false);
               
                return mainView;
        }
   
    @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
               
        }
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        // Hashmap for ListView
        plantsList = new ArrayList<HashMap<String, String>>();
 
        // Loading plants in Background Thread
        new LoadAllPlants().execute();
 
        // Get listview
        ListView lv = getListView();
 
        // on seleting single plant
        // launching Edit Plant Screen
        lv.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText()
                        .toString();
 
                // Starting new intent
                Intent in = new Intent(getActivity(),    EditPlantActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, pid);
 
                // starting new activity and expecting some response back
                startActivityForResult(in, 100);
            }
        });
 
    }
 
    // Response from Edit Plant Activity
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // if result code 100
        if (resultCode == 100) {
            // if result code 100 is received
            // means user edited/deleted plant
            // reload this screen again
            Intent intent = getActivity().getIntent();
           
         /*
          *  Cosa vuoi che succeda qui?
          *  Vuoi che si chiuda l'activity che contiene le tabs o che cambi il fragment correntemente
          *  visualizzato?
          *
          *  Nel caso in cui tu voglia chiudere l'activity devi fare getActivity().finish();
          *  
          */

//            finish();  
           
            startActivity(intent);
        }
 
    }
 
    /**
     * Background Async Task to Load all plant by making HTTP Request
     * */

    class LoadAllPlants extends AsyncTask<String, String, String> {
 
        /**
         * Before starting background thread Show Progress Dialog
         * */

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Loading plants. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
 
        /**
         * getting All plants from url
         * */

        protected String doInBackground(String... args) {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // getting JSON string from URL
            JSONObject json = jParser.makeHttpRequest(url_all_plants, "GET", params);
 
            // Check your log cat for JSON reponse
            Log.d("All Plants: ", json.toString());
 
            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
 
                if (success == 1) {
                    // plants found
                    // Getting Array of Plants
                    plants = json.getJSONArray(TAG_PLANTS);
 
                    // looping through All Plants
                    for (int i = 0; i < plants.length(); i++) {
                        JSONObject c = plants.getJSONObject(i);
 
                        // Storing each json item in variable
                        String id = c.getString(TAG_PID);
                        String name = c.getString(TAG_NAME);
 
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();
 
                        // adding each child node to HashMap key => value
                        map.put(TAG_PID, id);
                        map.put(TAG_NAME, name);
 
                        // adding HashList to ArrayList
                        plantsList.add(map);
                    }
                } else {
                    // no plants found
                    // Launch Add New plant Activity
                    Intent i = new Intent(getActivity(), NewPlantActivity.class);
                    // Closing all previous activities
                    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(i);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
 
            return null;
        }
 
        /**
         * After completing background task Dismiss the progress dialog
         * **/

        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting all plants
            pDialog.dismiss();
            // updating UI from Background Thread
            getActivity().runOnUiThread(new Runnable() {
                public void run() {
                    /**
                     * Updating parsed JSON data into ListView
                     * */

                    ListAdapter adapter = new SimpleAdapter(getActivity(), plantsList,R.layout.list_item, new String[] { TAG_PID, TAG_NAME},
                            new int[] { R.id.pid, R.id.name });
                    // updating listview
                    setListAdapter(adapter);
                }
            });
 
        }
 
    }
}
« Ultima modifica: 13 Marzo 2014, 14:33:09 CET da a_droid, Reason: Merged DoublePost »

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Convertire ListActivity in ListFragment
« Risposta #4 il: 13 Marzo 2014, 14:55:41 CET »
0
Assolutamente nessun problema se non rispondi subito, ci mancherebbe ;)

Ho aggiornato il codice e ora non da alcun errore di codice, ma da errore in fase di lancio.

In particolare mi è saltato all'occhio questo:

Codice: [Seleziona]
03-13 09:52:09.344: E/AndroidRuntime(1872): java.lang.IllegalStateException: Content view not yet created
Ti scrivo il logcat completo:

Codice: [Seleziona]
03-13 09:52:09.264: D/dalvikvm(1872): GC_FOR_ALLOC freed 62K, 6% free 3098K/3272K, paused 1ms, total 2ms
03-13 09:52:09.264: I/dalvikvm-heap(1872): Grow heap (frag case) to 4.207MB for 1127532-byte allocation
03-13 09:52:09.284: D/dalvikvm(1872): GC_FOR_ALLOC freed 2K, 5% free 4197K/4376K, paused 20ms, total 20ms
03-13 09:52:09.344: D/AndroidRuntime(1872): Shutting down VM
03-13 09:52:09.344: W/dalvikvm(1872): threadid=1: thread exiting with uncaught exception (group=0xb0d23b20)
03-13 09:52:09.344: E/AndroidRuntime(1872): FATAL EXCEPTION: main
03-13 09:52:09.344: E/AndroidRuntime(1872): Process: com.example.tabstelegeatest, PID: 1872
03-13 09:52:09.344: E/AndroidRuntime(1872): java.lang.IllegalStateException: Content view not yet created
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at com.example.tabstelegeatest.PlantsFragment.onCreate(PlantsFragment.java:79)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:834)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:768)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:746)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:128)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.view.ViewPager.populate(ViewPager.java:802)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.View.measure(View.java:16497)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.View.measure(View.java:16497)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.View.measure(View.java:16497)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.View.measure(View.java:16497)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.View.measure(View.java:16497)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.Choreographer.doFrame(Choreographer.java:544)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.os.Handler.handleCallback(Handler.java:733)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.os.Handler.dispatchMessage(Handler.java:95)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.os.Looper.loop(Looper.java:136)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at android.app.ActivityThread.main(ActivityThread.java:5017)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at java.lang.reflect.Method.invokeNative(Native Method)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at java.lang.reflect.Method.invoke(Method.java:515)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-13 09:52:09.344: E/AndroidRuntime(1872):         at dalvik.system.NativeStart.main(Native Method)

Grazie infinite dell'aiuto offerto fino ad ora ;)

Marco

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Convertire ListActivity in ListFragment
« Risposta #5 il: 13 Marzo 2014, 15:08:28 CET »
+1
Prego, di niente... più che altro il problema è che non posso controllare il codice che ti scrivo.

Comunque quell'errore è normale, ho scritto una cavolata XD e ti spiego anche perché :
 
Codice (Java): [Seleziona]
03-13 09:52:09.344: E/AndroidRuntime(1872): java.lang.IllegalStateException: Content view not yet created
L'errore viene dato qui
Codice (Java): [Seleziona]
  ListView lv = getListView(); Il metodo getListView() è un metodo della classe ListFragment che cerca di ottenere la ListView che implicitamente contiene il ListFragment.
Il problema è che stiamo richiamando questo metodo troppo presto, in onCreate(), quando ancora le view del Fragment non sono state create.
Dobbiamo spostare tutto il codice che utilizza dei riferimenti alle view in un metodo che viene richiamato sicuramente DOPO che la view del Fragment è stato creato, e si chiama  "onViewCreated".
Quindi cancella completamente il metodo onCreate e al suo posto inserisci questo metodo :

Codice (Java): [Seleziona]
public void onViewCreated(View view, Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);

        // Hashmap for ListView
        plantsList = new ArrayList<HashMap<String, String>>();
 
        // Loading plants in Background Thread
        new LoadAllPlants().execute();
 
        // Get listview
        ListView lv = getListView();
 
        // on seleting single plant
        // launching Edit Plant Screen
        lv.setOnItemClickListener(new OnItemClickListener() {
 
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // getting values from selected ListItem
                String pid = ((TextView) view.findViewById(R.id.pid)).getText()              .toString();
 
                // Starting new intent
                Intent in = new Intent(getActivity(),    EditPlantActivity.class);
                // sending pid to next activity
                in.putExtra(TAG_PID, pid);
 
                // starting new activity and expecting some response back
                startActivityForResult(in, 100);
            }
        });
 
   
               
        }

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Convertire ListActivity in ListFragment
« Risposta #6 il: 13 Marzo 2014, 15:18:20 CET »
0
Qui non ne usciamo più, ora l'errore è diverso.

Codice: [Seleziona]
03-13 10:13:38.630: D/dalvikvm(1823): GC_FOR_ALLOC freed 97K, 7% free 3099K/3308K, paused 2ms, total 2ms
03-13 10:13:38.630: I/dalvikvm-heap(1823): Grow heap (frag case) to 4.207MB for 1127532-byte allocation
03-13 10:13:38.660: D/dalvikvm(1823): GC_FOR_ALLOC freed 2K, 5% free 4197K/4412K, paused 26ms, total 26ms
03-13 10:13:38.710: D/dalvikvm(1823): GC_FOR_ALLOC freed 186K, 7% free 4525K/4820K, paused 1ms, total 2ms
03-13 10:13:38.710: W/System.err(1823): org.apache.http.conn.HttpHostConnectException: Connection to http://192.168.0.8 refused
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:183)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
03-13 10:13:38.710: W/System.err(1823):         at com.example.tabstelegeatest.JSONParser.makeHttpRequest(JSONParser.java:62)
03-13 10:13:38.710: W/System.err(1823):         at com.example.tabstelegeatest.PlantsFragment$LoadAllPlants.doInBackground(PlantsFragment.java:151)
03-13 10:13:38.710: W/System.err(1823):         at com.example.tabstelegeatest.PlantsFragment$LoadAllPlants.doInBackground(PlantsFragment.java:1)
03-13 10:13:38.710: W/System.err(1823):         at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-13 10:13:38.710: W/System.err(1823):         at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-13 10:13:38.710: W/System.err(1823):         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-13 10:13:38.710: W/System.err(1823):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-13 10:13:38.710: W/System.err(1823):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-13 10:13:38.710: W/System.err(1823):         at java.lang.Thread.run(Thread.java:841)
03-13 10:13:38.710: W/System.err(1823): Caused by: java.net.ConnectException: socket failed: EACCES (Permission denied)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:181)
03-13 10:13:38.710: W/System.err(1823):         ... 15 more
03-13 10:13:38.710: W/System.err(1823): Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)
03-13 10:13:38.710: W/System.err(1823):         at libcore.io.IoBridge.socket(IoBridge.java:576)
03-13 10:13:38.710: W/System.err(1823):         at java.net.PlainSocketImpl.create(PlainSocketImpl.java:201)
03-13 10:13:38.710: W/System.err(1823):         at java.net.Socket.checkOpenAndCreate(Socket.java:664)
03-13 10:13:38.710: W/System.err(1823):         at java.net.Socket.connect(Socket.java:808)
03-13 10:13:38.710: W/System.err(1823):         at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
03-13 10:13:38.720: W/System.err(1823):         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
03-13 10:13:38.720: W/System.err(1823):         ... 15 more
03-13 10:13:38.720: W/System.err(1823): Caused by: libcore.io.ErrnoException: socket failed: EACCES (Permission denied)
03-13 10:13:38.720: W/System.err(1823):         at libcore.io.Posix.socket(Native Method)
03-13 10:13:38.720: W/System.err(1823):         at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:181)
03-13 10:13:38.720: W/System.err(1823):         at libcore.io.IoBridge.socket(IoBridge.java:561)
03-13 10:13:38.720: W/System.err(1823):         ... 20 more
03-13 10:13:38.720: E/Buffer Error(1823): Error converting result java.lang.NullPointerException: lock == null
03-13 10:13:38.720: E/JSON Parser(1823): Error parsing data org.json.JSONException: End of input at character 0 of
03-13 10:13:38.720: W/dalvikvm(1823): threadid=11: thread exiting with uncaught exception (group=0xb0c9db20)
03-13 10:13:38.720: E/AndroidRuntime(1823): FATAL EXCEPTION: AsyncTask #1
03-13 10:13:38.720: E/AndroidRuntime(1823): Process: com.example.tabstelegeatest, PID: 1823
03-13 10:13:38.720: E/AndroidRuntime(1823): java.lang.RuntimeException: An error occured while executing doInBackground()
03-13 10:13:38.720: E/AndroidRuntime(1823):         at android.os.AsyncTask$3.done(AsyncTask.java:300)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.util.concurrent.FutureTask.run(FutureTask.java:242)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.lang.Thread.run(Thread.java:841)
03-13 10:13:38.720: E/AndroidRuntime(1823): Caused by: java.lang.NullPointerException
03-13 10:13:38.720: E/AndroidRuntime(1823):         at com.example.tabstelegeatest.PlantsFragment$LoadAllPlants.doInBackground(PlantsFragment.java:154)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at com.example.tabstelegeatest.PlantsFragment$LoadAllPlants.doInBackground(PlantsFragment.java:1)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at android.os.AsyncTask$2.call(AsyncTask.java:288)
03-13 10:13:38.720: E/AndroidRuntime(1823):         at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-13 10:13:38.720: E/AndroidRuntime(1823):         ... 4 more
03-13 10:13:38.730: D/(1823): HostConnection::get() New Host Connection established 0xb8ede790, tid 1823
03-13 10:13:38.770: W/EGL_emulation(1823): eglSurfaceAttrib not implemented
03-13 10:13:38.770: D/OpenGLRenderer(1823): Enabling debug mode 0
03-13 10:13:39.010: W/EGL_emulation(1823): eglSurfaceAttrib not implemented
03-13 10:13:39.610: E/WindowManager(1823): android.view.WindowLeaked: Activity com.example.tabstelegeatest.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b10f9278 V.E..... R......D 0,0-729,192} that was originally added here
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
03-13 10:13:39.610: E/WindowManager(1823):         at android.app.Dialog.show(Dialog.java:286)
03-13 10:13:39.610: E/WindowManager(1823):         at com.example.tabstelegeatest.PlantsFragment$LoadAllPlants.onPreExecute(PlantsFragment.java:141)
03-13 10:13:39.610: E/WindowManager(1823):         at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
03-13 10:13:39.610: E/WindowManager(1823):         at android.os.AsyncTask.execute(AsyncTask.java:535)
03-13 10:13:39.610: E/WindowManager(1823):         at com.example.tabstelegeatest.PlantsFragment.onViewCreated(PlantsFragment.java:70)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.view.ViewPager.populate(ViewPager.java:804)
03-13 10:13:39.610: E/WindowManager(1823):         at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.View.measure(View.java:16497)
03-13 10:13:39.610: E/WindowManager(1823):         at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
03-13 10:13:39.610: E/WindowManager(1823):         at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.View.measure(View.java:16497)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-13 10:13:39.610: E/WindowManager(1823):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.View.measure(View.java:16497)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-13 10:13:39.610: E/WindowManager(1823):         at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.View.measure(View.java:16497)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
03-13 10:13:39.610: E/WindowManager(1823):         at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-13 10:13:39.610: E/WindowManager(1823):         at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2291)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.View.measure(View.java:16497)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.Choreographer.doFrame(Choreographer.java:544)
03-13 10:13:39.610: E/WindowManager(1823):         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-13 10:13:39.610: E/WindowManager(1823):         at android.os.Handler.handleCallback(Handler.java:733)
03-13 10:13:39.610: E/WindowManager(1823):         at android.os.Handler.dispatchMessage(Handler.java:95)
03-13 10:13:39.610: E/WindowManager(1823):         at android.os.Looper.loop(Looper.java:136)
03-13 10:13:39.610: E/WindowManager(1823):         at android.app.ActivityThread.main(ActivityThread.java:5017)
03-13 10:13:39.610: E/WindowManager(1823):         at java.lang.reflect.Method.invokeNative(Native Method)
03-13 10:13:39.610: E/WindowManager(1823):         at java.lang.reflect.Method.invoke(Method.java:515)
03-13 10:13:39.610: E/WindowManager(1823):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-13 10:13:39.610: E/WindowManager(1823):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-13 10:13:39.610: E/WindowManager(1823):         at dalvik.system.NativeStart.main(Native Method)

Non sono molto esperto di Logcat ancora, però a occhio sembra che non riesca a fare il parsing di JSON, dico bene? Solo che il parsing è corretto perchè ho uno stesso programma che lo fa fuori dal Fragment in maniera corretta.

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Convertire ListActivity in ListFragment
« Risposta #7 il: 13 Marzo 2014, 15:33:12 CET »
0
 Da una prima occhiata sembra prima di tutto un'errore di connessione al server :
Codice (Java): [Seleziona]
03-13 10:13:38.710: W/System.err(1823): org.apache.http.conn.HttpHostConnectException: Connection to http://192.168.0.8 refused

C'è anche un'altro errore :
Codice (Java): [Seleziona]
03-13 10:13:38.720: E/AndroidRuntime(1823): Caused by: java.lang.NullPointerException
03-13 10:13:38.720: E/AndroidRuntime(1823):         at com.example.tabstelegeatest.PlantsFragment$LoadAllPlants.doInBackground(PlantsFragment.java:154)

Ma questo NullPointer sembra dovuto al fatto che la chiamata al WebService è andata male e quindi la variabile json è null.

Codice (Java): [Seleziona]
           JSONObject json = jParser.makeHttpRequest(url_all_plants, "GET", params);
 
            // Check your log cat for JSON reponse
            Log.d("All Plants: ", json.toString());
 
            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);
 


Stai usando un emulatore o un dispositivo reale?

Ti consiglio di dare un'occhiata a questo thread : android - socket failed: EACCES (Permission denied) - Stack Overflow

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Convertire ListActivity in ListFragment
« Risposta #8 il: 13 Marzo 2014, 15:51:29 CET »
0
Avevo scioccamente dimenticato di aggiungere l'uses-permission INTERNET che nell'altra prova senza il fragment c'era, e qui lo avevo dimenticato!
In ogni caso grazie 1000, ho fatto un passettino in avanti, e non è che ti dispiace scambiarci i contatti? Per me sarebbe molto importante avere una persona che può darmi una mano perchè di problemi e di dubbi ne ho tanti, perchè su internet e anche sui libri ti spiegano android, ma a volte ho difficoltà a integrare ciò che apprendo a ciò che mi serve, perchè quando entra in gioco un database esterno come nel mio caso diventa tutto più difficile e complicato.

In ogni caso grazie 1000, in caso contrario aprirò un nuovo topic, perchè ho dei problemi a integrare uno spinner dentro una di queste pagine per prendere i dati direttamente dal database.
Ho un esempio che funziona, ma usa dei metodi diversi e quindi non mi funziona nel mio progetto.

Grazie infinite.

Marco

Offline a_droid

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +5
    • Mostra profilo
Re:Convertire ListActivity in ListFragment
« Risposta #9 il: 13 Marzo 2014, 16:06:49 CET »
0
Tranquillo...mi ha fatto piacere aiutarti.
Se vuoi puoi mandarmi un messaggio privato sul forum quando hai bisogno, ma purtroppo ho pochissimo tempo perché lavoro...
Fammi sapere, ciao  :-)

Offline marco_88

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Sistema operativo:
    Kubuntu 13.10
Re:Convertire ListActivity in ListFragment
« Risposta #10 il: 13 Marzo 2014, 16:10:56 CET »
0
Tranquillo, lavoro anche io, infatti è per lavoro che mi sto cercando di imparare. Comunque se dopo puoi aiutarmi, apro un nuovo topic per altri problemi che ho. Non ho problemi ad aprire topic nuovi, però è sempre raro trovare una persona disposta ad aiutarti, e tu sei stato molto gentile.
Grazie 1000.

Post unito: 13 Marzo 2014, 19:20:17 CET
Scusa il disturbo ma ho notato un problema nella parte di prima che mi hai aiutato a far funzionare.

Ora la lista viene caricata nel fragment, però se provo a cliccare su un impianto dovrebbe invocare la classe EditPlantActivity, però va in crash.

Ho visto ora il commento che mi hai scritto:

Codice: [Seleziona]
// Response from Edit Plant Activity
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == 100) {
            Intent intent = getActivity().getIntent();
           
         /*
          *  Cosa vuoi che succeda qui?
          *  Vuoi che si chiuda l'activity che contiene le tabs o che cambi il fragment correntemente
          *  visualizzato?
          *
          *  Nel caso in cui tu voglia chiudere l'activity devi fare getActivity().finish();
          * 
          */
//            finish(); 
           
            startActivity(intent);
        }
 
    }

In realtà devo ancora pensarci come fare questa cosa, ma tu cosa suggerisci?

Cioè è una vista per modificare un impianto, secondo te è meglio che stia fuori dal fragment a tabs o metterlo anch'esso all'interno?

Comunque facciamo che lo voglio mettere fuori dal fragment questo, cosa dovrei fare?

Ti scrivo il Logcat che mi da:

Codice: [Seleziona]
03-13 19:11:30.664: E/AndroidRuntime(15039): FATAL EXCEPTION: main
03-13 19:11:30.664: E/AndroidRuntime(15039): Process: com.example.tabstelegeatest, PID: 15039
03-13 19:11:30.664: E/AndroidRuntime(15039): android.os.NetworkOnMainThreadException
03-13 19:11:30.664: E/AndroidRuntime(15039):         at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at libcore.io.IoBridge.connect(IoBridge.java:112)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at java.net.Socket.connect(Socket.java:843)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at com.example.tabstelegeatest.JSONParser.makeHttpRequest(JSONParser.java:62)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at com.example.tabstelegeatest.EditPlantActivity$GetPlantDetails$1.run(EditPlantActivity.java:130)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at android.os.Handler.handleCallback(Handler.java:733)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at android.os.Handler.dispatchMessage(Handler.java:95)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at android.os.Looper.loop(Looper.java:136)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at android.app.ActivityThread.main(ActivityThread.java:5050)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at java.lang.reflect.Method.invoke(Native Method)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
03-13 19:11:30.664: E/AndroidRuntime(15039):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)

Da un errore sul NetworkOnMainThreadException appena cerco di aprire un impianto, quindi quando viene invocato l'EditPlantActivity.

Ho letto qualcosa di StrictMode, ma non ho capito molto bene.

Grazie infinite.

Marco
« Ultima modifica: 13 Marzo 2014, 19:20:17 CET da marco_88, Reason: Merged DoublePost »