Oui, effectivement. C'est bizarre. J'ai toujours eu des erreurs lorsque je n'ai pas exécuter mes requêtes dans un thread secondaire et c'est vivement conseillé de toute façon.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Bon donc je te poste mon code puis je dis ce qui est en rouge (tu vas me dire que j'ai rien compris
package rapport.presse.cim;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.util.Log;
public class httpConnexion extends AsyncTask<Void, String, Void> {
public static final String strURL = "http://192.168.1.100/ville.php?donnee=getL";
public ArrayList<String> getServerData(){
String result = "";
InputStream is = null;
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("ville","L"));
ArrayList<String> data = new ArrayList<String>();
@Override
protected void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
/**===============================================
Envoie de la requête HTTP
===============================================**/
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(strURL);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
catch(Exception e){
Log.e("log_tag", "Error in http connection " + e.toString());
}
/**===============================================
End
===============================================**/
/**===============================================
Conversion de la requête en string
===============================================**/
try{
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();
}catch(Exception e){
Log.e("log_tag", "Error converting result " + e.toString());
}
/**===============================================
End
===============================================**/
/**===============================================
On parse les données Json
===============================================**/
try{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
data.add(json_data.getString("Nom_ville"));
// Affichage ID_ville et Nom_ville dans le LogCat
Log.i("log_tag",json_data.getString("Nom_ville")
);
// Résultats de la requête
}
}catch(JSONException e){
Log.e("log_tag", "Error parsing data " + e.toString());
}
/**===============================================
End
===============================================**/
return null;
}
return data;
}
}
Pour ma class httpConnexion il me dit ça: The type httpConnexion must implement the inherited abstract method AsyncTask<Void,String,Void>.doInBackground(Void...)
Bon je suppose que c'est à cause des void dans les paramètres
Pour la fonction doInBackground: void is an invalid type for the variable doInBackground
Et puis les ... syntaxe error et l'arg0 il ne sait pas le résoudre
Ca m'ennuie de ne pas avoir réussi à terminer mon chapitre sur les requêtes HTTP. Tu ne t'y prends pas très bien. :/
Déjà, tu n'as pas fermé ta méthode getServeurData. Les erreurs qui s'affichent sont faussées. Puis, je n'ai pas testé mais voilà comment je vois les choses (j'ai commenté mon code. Je n'ai pas le temps d'expliquer le tout en détail) :
package be.impactit.shared.views;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.util.Log;
import be.impactit.directory.activities.BuildConfig;
public class HttpConnexion {
private static final String TAG = "log_tag";
/**
* Télécharge via une requête POST. Cette méthode doit se faire dans un
* thread secondaire !
*
* @param url
* Url de la requête
* @param params
* Paramètres à rajouter
* @return input stream
*/
public InputStream downloadPost(String url, Map<String, String> params) {
InputStream is = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
// Ajoute des paramètres à la requête
if (params != null) {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> e : params.entrySet()) {
nameValuePairs.add(new BasicNameValuePair(e.getKey(), e
.getValue()));
}
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
}
HttpResponse response = httpclient.execute(httpPost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (ClientProtocolException e) {
if (BuildConfig.DEBUG)
Log.e(TAG, "Client Protocol Exception : " + e.toString());
} catch (IOException e) {
if (BuildConfig.DEBUG)
Log.e(TAG, "IO Exception : " + e.toString());
}
return is;
}
/**
* Convertis un objet InputStream en chaine de caractères
*
* @param is
* Input Stream
* @return fichier json en string
*/
public String convertInputStreamToString(InputStream is) {
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
} catch (Exception e) {
Log.e(TAG, "Error converting result " + e.toString());
}
return sb.toString();
}
/**
* Parse le fichier JSON dans une liste
*
* @param result
* Fichier json
* @return liste du résultat du parsing
*/
public List<String> parseJsonFile(String result) {
List<String> data = new ArrayList<String>();
try {
JSONArray jArray = new JSONArray(result);
for (int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
data.add(json_data.getString("Nom_ville"));
// Affichage ID_ville et Nom_ville dans le LogCat
Log.i("log_tag", json_data.getString("Nom_ville"));
// Résultats de la requête
}
} catch (JSONException e) {
Log.e(TAG, "Error parsing data " + e.toString());
}
return data;
}
}
package be.impactit.shared.views;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
public class TestClass extends Activity {
private HttpConnexion mHttpConnexion = new HttpConnexion();
private InputStream mInputStream;
private List<String> mData = new ArrayList<String>();
private ArrayAdapter<String> mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContent etc
new AsyncDownload().execute();
// Création d'un adaptateur avec aucun élèment dans la liste
this.mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mData);
// Attache à son adaptateur à sa ListView
}
public class AsyncDownload extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// Je suis dans le thread secondaire
mInputStream = mHttpConnexion.downloadPost(
"http://192.168.1.100/ville.php?donnee=getL", null);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// Ici je ne suis plus dans le thread secondaire
if (mInputStream != null) {
// Aucun problème survenu
String res = mHttpConnexion.convertInputStreamToString(mInputStream);
mData = mHttpConnexion.parseJsonFile(res);
// Ajoute tous les élèments dans l'adaptateur
for (String str : mData) {
mAdapter.add(str);
}
// Notifie les changements pour les voir à l'écran
mAdapter.notifyDataSetChanged();
}
}
}
}
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Bon j'ai un peu modifié mon code pour que ça ressemble au tient, mais je ne test pas de suite pasque ça va planter
J'ai juste besoin d'explications pour tes paramètres (pour dans mon cas).
En fait ton code m'a quand même donné pas mal d'idées
Donc si tu te souviens un peu de ma structure, j'ai genre 6 boutons et en-dessous de chaque j'ai une listView.
Donc je vois que tu te bases sur params, mais c'est appelé une fois dans la fonction, mais si je clique sur un bouton, j'aimerais changer ces paramètres qui passe par le post pour récupérer les bonne infos.
Mais là je ne vois pas trop via ton système comment je pourrais faire en fait :s
Et j'ai une petite question, pour les cliques, je récupères mes 6 boutons et donc mes listView en plus je susspose, et par exemple je met un listener sur le bouton 1.
Et là en fait je suppose que j'appel la fonction doInBackground(Void... params) pour pouvoir fournir les paramètre en fonction de la liste que j'affiche et ensuite la seconde fonction pour récupérer les valeurs?
Il a bien fallu que je relise 2-3 fois ton poste pour que je puisse comprendre (du moins, je l'espère avoir compris ). Donc :
Citation : vangoeth
En fait ton code m'a quand même donné pas mal d'idées
C'était l'idée. Je n'ai pas testé le code que je t'ai fourni (mais il devrait être bon).
Citation : vangoeth
Donc si tu te souviens un peu de ma structure, j'ai genre 6 boutons et en-dessous de chaque j'ai une listView.
Donc je vois que tu te bases sur params, mais c'est appelé une fois dans la fonction, mais si je clique sur un bouton, j'aimerais changer ces paramètres qui passe par le post pour récupérer les bonne infos.
Mais là je ne vois pas trop via ton système comment je pourrais faire en fait :s
Si tu parles des paramètres que j'envoie à ma méthode publicInputStreamdownloadPost(Stringurl,Map<String,String>params), il s'agit simplement des valeurs que tu comptes passer à ton serveur pour qu'il traite ta requête. Il suffit de lui envoyer une Map avec comme clé, la clé que tu vas utiliser côté PHP pour récupérer la valeur du côté valeur de la Map. Je ne sais pas si je suis clair mais j'ai cru comprendre que tu voulais passer des paramètres au vue de ton code précédent.
Citation : vangoeth
Et j'ai une petite question, pour les cliques, je récupères mes 6 boutons et donc mes listView en plus je susspose, et par exemple je met un listener sur le bouton 1.
Et là en fait je suppose que j'appel la fonction doInBackground(Void... params) pour pouvoir fournir les paramètre en fonction de la liste que j'affiche et ensuite la seconde fonction pour récupérer les valeurs?
Là je suis encore moins sûr d'avoir compris mais oui, il est tout à fait possible de passer des objets à la méthode doInBackground(Void...params). Il faut alors changer l'un des opérateurs génériques de la classe interne AsyncTask. Lorsque tu appelleras la méthode execute() sur l'instance de ton AsyncTask, tu lui donnes en paramètre ce que tu veux. Tout ça devrait être expliqué dans le tutoriel que je t'ai donné plus haut.
Si j'ai pas tout bien compris, re-explique clairement.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Alors pour la première question c'est parfait si j'ai bien compris ta réponse
Donc ça permet de récupérer les valeurs dans la requête sql via $_REQUEST['nom du post']?
Pour la seconde, je récupère les boutons et les listView de mon layout, puis dans chaque fonction de click j'appel doInBackground() et onPostExecute puis je fait le test pour afficher ou non la liste? par contre j'ai un blocage surt ton for(str : mdata) parce que pour moi un for c'est for i:1:10 ou for 1:10 donc par défaut me semble que c'est par pat de 1?
Bon, je vais essayé de structurer toutes tes questions.
Citation : vangoeth
Alors pour la première question c'est parfait si j'ai bien compris ta réponse
Donc ça permet de récupérer les valeurs dans la requête sql via $_REQUEST['nom du post']?
Ouaip.
Citation : vangoeth
Pour la seconde, je récupère les boutons et les listView de mon layout, puis dans chaque fonction de click j'appel doInBackground() et onPostExecute puis je fait le test pour afficher ou non la liste?
Non, tu ne dois pas appeler toi même doInBackground() et onPostExecute. Sur ton instance de la méthode AsyncTask, tu appelles la méthode execute() et le système se chargera d'appeler les méthodes callback que tu implémentes dedans. Tu ne dois pas te soucier de les appeler pour résumer.
Citation : vangoeth
par contre j'ai un blocage surt ton for(str : mdata) parce que pour moi un for c'est for i:1:10 ou for 1:10 donc par défaut me semble que c'est par pat de 1?
Il s'agit d'un autre type de boucle.
for (String str : mData) {
mAdapter.add(str);
}
=
for (int i = 0; i < mData.size(); i++) {
String str = mData.get(i);
mAdapter.add(str);
}
Citation : vangoeth
Pas facile à expliquer tt ça
Normal.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Bon maintenant c'est assé amusant
Mon appli se lance avec tous les boutons (normal vu que je les appel ^^) mais quand je clique sur le seul bouton que j'ai rendu cliquable, l'app plante xD
Je te passe mon code que j'ai un peu modifié (le paramètre on verra ça après, une chose à la fois :p)
Et le logCat bien sûr
Mon httpConnexion:
package rapport.presse.cim;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.util.Log;
public class httpConnexion {
//public static final String strURL = "http://192.168.1.100/ville.php?donnee=getL";
/**===============================================
Envoie de la requête HTTP
===============================================**/
/**
* @param url
* @param params
* @return input stream
**/
public InputStream getConnexionHttp(String url){ //Ajout des paramètres par la suite pour post
InputStream is = null;
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("ville","L"));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
catch(Exception e){
Log.e("log_tag", "Error in http connection " + e.toString());
}
return is;
}
/**===============================================
End
===============================================**/
/**===============================================
Conversion de la requête en string
===============================================**/
public String convertToString(InputStream is){
StringBuilder sb = new StringBuilder();
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
}catch(Exception e){
Log.e("log_tag", "Error converting result " + e.toString());
}
return sb.toString();
}
/**===============================================
End
===============================================**/
/**===============================================
On parse les données Json
===============================================**/
public List<String> parseJsonFile(String result){
List<String> data = new ArrayList<String>();
try{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
data.add(json_data.getString("Nom_ville"));
// Affichage ID_ville et Nom_ville dans le LogCat
Log.i("log_tag",json_data.getString("Nom_ville")
);
// Résultats de la requête
}
}catch(JSONException e){
Log.e("log_tag", "Error parsing data " + e.toString());
}
return data;
/**===============================================
End
===============================================**/
}
}
Et mon first:
package rapport.presse.cim;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
public class first extends Fragment {
private httpConnexion mHttpConnexion = new httpConnexion();
private InputStream mInputStream;
private List<String> mData = new ArrayList<String>();
private ArrayAdapter<String> mAdapter;
private ListView mListViewAll;
private ListView mListViewQuot;
private ListView mListViewHebd;
private ListView mListViewMens;
private ListView mListVieuwTrim;
private ListView mListViewAnn;
Button mButton1;
Button mButton2;
Button mButton3;
Button mButton4;
Button mButton5;
Button mButton6;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.first, container, false);
ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, mData);
/**===============================================
Gestion des cliques et listes
===============================================**/
//récupération des Boutons
mButton1 = (Button) v.findViewById(R.id.all);
mButton2= (Button) v.findViewById(R.id.quot);
mButton3 = (Button)v.findViewById(R.id.hebd);
mButton4 = (Button)v.findViewById(R.id.mens);
mButton5 = (Button)v.findViewById(R.id.trim);
mButton6 = (Button)v.findViewById(R.id.ann);
mListViewAll = (ListView) v.findViewById(R.id.ListViewAll);
mListViewAll.setAdapter(mAdapter);
//Test action sur le bouton + visibilité du ListView
mButton1.setOnClickListener (new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
new AsyncDownload().execute();
mListViewAll.setVisibility(View.GONE);
if(mListViewAll.isShown()){
mListViewAll.setVisibility(View.GONE);
}
else{
mListViewAll.setVisibility(View.VISIBLE);
}
}
});
return v;
}
public class AsyncDownload extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
mInputStream = mHttpConnexion.getConnexionHttp("http://192.168.1.100/ville.php?donnee=getL");
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
if (mInputStream != null){
String res = mHttpConnexion.convertToString(mInputStream);
mData = mHttpConnexion.parseJsonFile(res);
for (String str : mData){
mAdapter.add(str);
}
mAdapter.notifyDataSetChanged();
}
}
}
}
/**===============================================
Gestion des listView
===============================================**/
/** 1.Récupération du ListView
* 2. Cacher la ListView
* 3.Création de l'adapter
* 4.On passe nos données au composant ListView
/**this.mListViewQuot = (ListView) v.findViewById(R.id.ListViewQuot);
mListViewQuot.setVisibility(View.GONE);
ArrayAdapter<String> mTabQuot = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
this.mListViewQuot.setAdapter(mTabQuot);
this.mListViewHebd = (ListView) v.findViewById(R.id.ListViewHebd);
mListViewHebd.setVisibility(View.GONE);
ArrayAdapter<String> mTabHebd = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
this.mListViewHebd.setAdapter(mTabHebd);
this.mListViewMens = (ListView) v.findViewById(R.id.ListViewMens);
mListViewMens.setVisibility(View.GONE);
ArrayAdapter<String> mTabMens = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
this.mListViewMens.setAdapter(mTabMens);
this.mListVieuwTrim = (ListView) v.findViewById(R.id.ListViewTrim);
mListVieuwTrim.setVisibility(View.GONE);
ArrayAdapter<String> mTabTrim = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
this.mListVieuwTrim.setAdapter(mTabTrim);
this.mListViewAnn = (ListView) v.findViewById(R.id.ListViewAnn);
mListViewAnn.setVisibility(View.GONE);
ArrayAdapter<String> mTabAnn = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, tabRevues);
this.mListViewAnn.setAdapter(mTabAnn);**/
/**End
mButton2.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(mListViewQuot.isShown()){
mListViewQuot.setVisibility(View.GONE);
}
else{
mListViewQuot.setVisibility(View.VISIBLE);
}
}
});
mButton3.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(mListViewHebd.isShown()){
mListViewHebd.setVisibility(View.GONE);
}
else{
mListViewHebd.setVisibility(View.VISIBLE);
}
}
});
mButton4.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(mListViewMens.isShown()){
mListViewMens.setVisibility(View.GONE);
}
else{
mListViewMens.setVisibility(View.VISIBLE);
}
}
});
mButton5.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(mListVieuwTrim.isShown()){
mListVieuwTrim.setVisibility(View.GONE);
}
else{
mListVieuwTrim.setVisibility(View.VISIBLE);
}
}
});
mButton6.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
if(mListViewAnn.isShown()){
mListViewAnn.setVisibility(View.GONE);
}
else{
mListViewAnn.setVisibility(View.VISIBLE);
}
}
});
/**End
return v;
}**/
Et pour finir le logCat qui s'existe au moment du clique :
08-04 08:41:36.121: E/AndroidRuntime(663): FATAL EXCEPTION: main
08-04 08:41:36.121: E/AndroidRuntime(663): java.lang.NullPointerException
08-04 08:41:36.121: E/AndroidRuntime(663): at rapport.presse.cim.first$AsyncDownload.onPostExecute(first.java:91)
08-04 08:41:36.121: E/AndroidRuntime(663): at rapport.presse.cim.first$AsyncDownload.onPostExecute(first.java:1)
08-04 08:41:36.121: E/AndroidRuntime(663): at android.os.AsyncTask.finish(AsyncTask.java:602)
08-04 08:41:36.121: E/AndroidRuntime(663): at android.os.AsyncTask.access$600(AsyncTask.java:156)
08-04 08:41:36.121: E/AndroidRuntime(663): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
08-04 08:41:36.121: E/AndroidRuntime(663): at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 08:41:36.121: E/AndroidRuntime(663): at android.os.Looper.loop(Looper.java:137)
08-04 08:41:36.121: E/AndroidRuntime(663): at android.app.ActivityThread.main(ActivityThread.java:4424)
08-04 08:41:36.121: E/AndroidRuntime(663): at java.lang.reflect.Method.invokeNative(Native Method)
08-04 08:41:36.121: E/AndroidRuntime(663): at java.lang.reflect.Method.invoke(Method.java:511)
08-04 08:41:36.121: E/AndroidRuntime(663): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-04 08:41:36.121: E/AndroidRuntime(663): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-04 08:41:36.121: E/AndroidRuntime(663): at dalvik.system.NativeStart.main(Native Method)
Je t'avoue que là l'orienté object j'en m'en prend plein la g***** mais ça va t'expliques pas mal donc ça rentre petit à petit xD
Par contre là j'ai un bug assé amusant
Je clique une fois sur le bouton ça m'afficher les 2 villes (victoire) j'appuie une 2ème fois sur le bouton pour replier la liste, ça me rajoute les 2 villes à la liste xD donc j'ai "Lille, Lion, Lille, Lion) xD
J'ai bougé l'appel de la fonction pour que ça se passe que qd la view est gone et qu'il faut la déplier mais pareil (c'est assé perturbant ^^)
Ah, tu n'as pas de notion d'orienté objet. Va falloir t'y mettre quand tu as le temps parce que c'est un peu la base à avoir. Je te conseille le tuto Java du site pour comprendre un peu comment ça fonctionne sinon tu risques d'être bloqué à un moment ou un autre.
Pour ton problème, c'est normal. Tu demandes d'exécuter le thread secondaire à chaque clique. Il suffit de la lancer une fois et c'est tout. Fais quelque chose comme ça :
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.first, container, false);
mAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, mData);
/**===============================================
Gestion des cliques et listes
===============================================**/
//récupération des Boutons
mButton1 = (Button) v.findViewById(R.id.all);
mButton2= (Button) v.findViewById(R.id.quot);
mButton3 = (Button)v.findViewById(R.id.hebd);
mButton4 = (Button)v.findViewById(R.id.mens);
mButton5 = (Button)v.findViewById(R.id.trim);
mButton6 = (Button)v.findViewById(R.id.ann);
mListViewAll = (ListView) v.findViewById(R.id.ListViewAll);
mListViewAll.setAdapter(mAdapter);
//Test action sur le bouton + visibilité du ListView
mButton1.setOnClickListener (new View.OnClickListener() {
public void onClick(View v) {
mListViewAll.setVisibility(View.GONE);
if(mListViewAll.isShown()){
mListViewAll.setVisibility(View.GONE);
}
else{
mListViewAll.setVisibility(View.VISIBLE);
}
}
});
new AsyncDownload().execute();
return v;
}
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Ha ok moi je pensais que je pouvais faire comme ça, vu que là il n'y a qu'un seul bouton mais après il y en aura plusieurs et en fonction du bouton sur lequel je clique, je dois afficher une liste différente en fait, donc je comptais passer des paramètres en fonction du onClick
Et en orienté objet ça va encore j'ai lu la partie dans l'énorme bouquin php donc je comprend ce qui se passe mais bon faut que je m'y adapte
Tient par contre ce qui est bizarre c'est que je ne sais plus cacher ma vue quand elle est ouverte et pourtant le code est le même :s
et j'ai une question, vu que je ne peux pas mettre dans le onClick, comment je fais pour lier l'utilisation de certaines valeurs en fonction du bouton? vu que je dois rentrer des paramètres dans ma requête http mais que ça passe par l'utilisation de la fonction principale? :s
Alors, je vois un peu mieux ce que tu comptes faire et je vais te proposer une méthode bien plus simple. Pourquoi ne pas avoir une multitude de boutons (autant que tu en as besoin) et qu'une seule ListView que tu alimenteras en fonction du bouton sur lequel tu cliques. Il te suffira d'aller chercher les éléments via une requête HTTP en enlevant ceux de l'état précédent. (Il y a certainement une méthode clear sur l'adaptateur qui te permettra d'enlever ses items à chaque fois).
Mais pour répondre à tes questions, c'es normal. Quand tu cliques sur ton bouton, tu demandes à ta liste de devenir invisible de toute façon. Après tu testes s'il est invisible ou non et tu avises en fonction de. Mais comme il est toujours invisible, il ira toujours dans la condition de cet état. Il faut que tu fasses ça comme pour l'exécution du thread secondaire, à part. Dans ta méthode onClick, tu n'auras que la condition.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Et c'est possible de la faire s'afficher en-dessous du bouton que je veux (c'est ça le problème en fait ^^).
J'aime cet effet de "déroulement" comme dans l'app mail de samsung
Par contre c'est là que je ne comprend pas trop comment tu peux lier une requête http différente si je suis obligé de mettre l'exécution de ma classe indépendamment du clique?
Cela voudrait dire que je dois sortir ma méthode de connexion http de la classe créé pour la récupération des données et à chaque clique j'appel la fonction http et en-dessous le parsing?
J'ai vu ce que tu voulais dire, sans doute une crasse qui traine d'une des nombreuses modification
Et c'est possible de la faire s'afficher en-dessous du bouton que je veux (c'est ça le problème en fait ^^).
Oui, c'est possible mais c'est un peu du bidouillage alors. Vaut mieux pas se lancer là dedans.
Citation : vangoeth
Par contre c'est là que je ne comprend pas trop comment tu peux lier une requête http différente si je suis obligé de mettre l'exécution de ma classe indépendamment du clique?
Pourquoi pas exécuter toutes des classes asynchrones à la fin de ta méthode onCreate pour alimenter toutes tes ListView ?
Citation : vangoeth
Cela voudrait dire que je dois sortir ma méthode de connexion http de la classe créé pour la récupération des données et à chaque clique j'appel la fonction http et en-dessous le parsing?
Je fais un effort mais j'ai rien pigé à cette phrase.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
J'avoue que la dernière phrase était tordue
Bon en fait je pense faire 2 grosses "fonctions" dans mon webservice, celle qui récupère les valeurs à mettre dans la listView, et ensuite celle qui en fonction de l'item cliqué dans la listView renverra un tableLayout (je pense que c'est le mieux pour gérer l'affichage en tableau ^^).
Donc ça me fait 2 url différents ensuite bah en fonction des choix (dans un premier temps de la période ensuite de la revues) je passe des variables différentes via mon http.
En sois avec tout ça il y aurait moyen de s'en sortir avec une seul class de connexion http et parsing d'après moi (bon c'est peut-être chaud mais me semble que c'est plus propre :p)
Citation : AndroWiid
Pourquoi pas exécuter toutes des classes asynchrones à la fin de ta méthode onCreate pour alimenter toutes tes ListView ?
J'appel la même class tout le temps mais avec des arguments différents?
C'est là que je cale en fait, comment appeler la bonne class vu qu'elle n'est pas dans la condition? A ce moment là je n'ai plus un seul adapter alors si je comprend bien?
Si j'ai bien compris le résultat final que tu tentes d'accéder, tu dois alimenter la liste par des boutons. Dans cette solution, il te suffit que d'une seule liste et un seul adaptateur que tu alimentes au clique des différents boutons. Si tu choisis de créer autant de classe interne que de boutons, il te suffit de rajouter l'évènement clique à chaque bouton que tu re-diriges vers la classe désirée.
Pour AsyncTask, c'est un peu spécial. C'est ce qu'on appel des types génériques qui se compte au nombre de 3. En voici les significations :
1. Type des paramètres fournis à la tâche. Par exemple, si tu donnes un String, ta méthode background s'attendra à recevoir un ou plusieurs string lorsque tu lanceras le thread (newMyAsyncTask().execute("string1","string2");).
2. Type de données transmises durant la progression du traitement. Il est possible de gérer une barre de progression gare à une méthode que tu redéfinies dans la classe (protectedvoidonProgressUpdate(Integer...values)). Si c'est un Integer (comme le montre l'exemple précédent et comme c'est souvent le cas), ta méthode s'attendra à recevoir un ou plusieurs int.
3. Type du résultat de la tâche. C'est à dire ce que retourne ta méthode protectedVoiddoInBackground(String...params) si tu veux qu'elle retourne quelque chose. Là elle ne retourne rien.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
Ok pour le click ça c'est pas compliqué
Par contre c'est pour lier le click à la méthode qui me pose problème, tu vois j'avais mi l'appel de la méthode
MyAsyncTask().execute()
dans le onClick justement, mais comme tu le dis (et ce qui est très logique) c'est qu'à chaque click sur le bouton il va recharger la liste.
J'ai une idée en tête mais c'est crade :p, c'est à chaque clique sur le bouton on commence par un reset de la list puis on appel la méthode (je vois pas d'autre solution comme ça :s).
Et pour la 2ème partie, je suppose que si je veux passer des paramètres comme par exemple l'url, et les post je dois passer par le
Marque ton sujet en résolu et crée un nouveau topic lorsque tu auras une nouvelle question histoire de pas faire un topic sur plusieurs sujets et long d'une dizaine de pages.
Sinon, de rien, c'est un plaisir.
Si vous voulez me retrouver, rendez-vous sur ZesteDeSavoir.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.