2010-04-13 10 views
4

Je travaille sur une application qui appelle un service Web, puis le service Web renvoie une liste de tableaux. Mon problème est que j'ai du mal à obtenir les données dans ArrayList et ensuite afficher dans un ListView. Des idées de ce que je fais mal? Je sais pertinemment que le service web renvoie une ArrayList. Tout semble fonctionner correctement, juste pas de données dans ListView ou ArrayList ..... Merci d'avance!Problème lors de la liaison d'un objet ksoap à une ArrayList dans Android

EDIT: Il m'a paru que les données auxquelles répond le service web est de type complexe. Je pense vraiment que c'est là que je me suis accroché, mais je ne sais pas comment le corriger.

21 avril 2010:

Alors j'ai finalement mon webservice retourne un tableau JSON. C'est maintenant le tour de ArrayList et/ou de ListView. J'ai le sentiment qu'une fois ce projet terminé, il pourrait faire un bon tutoriel ou par exemple ...

package com.maskau; 

import java.util.ArrayList; 
import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.AndroidHttpTransport; 
import android.app.*; 
import android.os.*; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.view.View; 
import android.view.View.OnClickListener; 


public class Home extends Activity implements Runnable{ 

/** Called when the activity is first created. */ 
public static final String SOAP_ACTION = "http://bb.mcrcog.com/GetArtist"; 
public static final String METHOD_NAME = "GetArtist"; 
public static final String NAMESPACE = "http://bb.mcrcog.com/"; 
public static final String URL = "http://bb.mcrcog.com/karaoke/service.asmx"; 
String wt; 
public static ProgressDialog pd; 
TextView text1; 
ListView lv; 
static EditText myEditText; 
static Button but; 
private ArrayList<String> Artist_Result = new ArrayList<String>(); 



@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.main); 
    myEditText = (EditText)findViewById(R.id.myEditText); 
    text1 = (TextView)findViewById(R.id.text1); 
    lv = (ListView)findViewById(R.id.lv); 
    but = (Button)findViewById(R.id.but); 

    but.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      wt = ("Searching for " + myEditText.getText().toString()); 
      text1.setText(""); 
      pd = ProgressDialog.show(Home.this, "Working...", wt , true, false); 
      Thread thread = new Thread(Home.this); 
      thread.start(); 
     } 
    } 
    ); 
} 

public void run() 
{ 
     try 
    { 
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      PropertyInfo pi = new PropertyInfo(); 
      pi.setName("ArtistQuery"); 
      pi.setValue(Home.myEditText.getText().toString()); 
      request.addProperty(pi); 
      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.dotNet = true; 
      envelope.setOutputSoapObject(request); 

      AndroidHttpTransport at = new AndroidHttpTransport(URL); 
      at.call(SOAP_ACTION, envelope); 
      java.util.Vector<Object> rs = (java.util.Vector<Object>)envelope.getResponse(); 
      if (rs != null) 
      { 
       for (Object cs : rs) 
       { 
        Artist_Result.add(cs.toString()); 
       } 
      } 
     } 

    catch (Exception e) 
     { 
     // Added this line, throws "org.ksoap2.serialization.SoapObject" when run 
      Artist_Result.add(e.getMessage());  
     } 

    handler.sendEmptyMessage(0); 
} 
private Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     ArrayAdapter<String> aa; 
    aa = new ArrayAdapter<String>(Home.this, android.R.layout.simple_list_item_1, Artist_Result); 
    lv.setAdapter(aa); 
    try 
    { 
     if (Artist_Result.isEmpty()) 
     { 
       text1.setText("No Results"); 
     } 
     else 
     { 

       text1.setText("Complete"); 
       myEditText.setText("Search Artist"); 
     } 
    } 
    catch(Exception e) 
    { 
    text1.setText(e.getMessage()); 
    } 
    aa.notifyDataSetChanged(); 
    pd.dismiss(); 
    } 
}; 
} 

données de résultat de l'échantillon de webservice:

<ArrayOfArtists> 
    <Artist> 
     <Track>.......</Track> 
    </Artist> 
    <Artist> 
     <Track>.......</Track> 
    </Artist> 
    <Artist> 
     <Track>.......</Track> 
    </Artist> 
</ArrayOfArtists> 
+0

Vous pourriez essayer de regarder ceci [tutoriel pour ksoap, android et .NET] (http://seesharpgears.blogspot.com/2010/10/ksoap- android-web-service-tutorial-with.html) – DFDF

Répondre

1

Vous devez définir l'adaptateur dans onCreate et dans handleMessage il suffit d'appeler lv.getAdapter(). notifyDataSetChanged()

+0

Merci Rpond, je peux voir comment cela ferait un peu plus facile. Cependant je suis toujours coincé. Le code déclenche le bloc if (Artist_Result.isEmpty()). Je dois faire des bêtises entre l'objet soap et l'ArrayList ... – Maskau

Questions connexes