2010-04-13 3 views
4

Я работаю над приложением, которое вызывает веб-службу, а затем webservice возвращает список массивов. Моя проблема заключается в том, что мне трудно получить данные в ArrayList, а затем отображать их в ListView. Любые идеи, что я делаю неправильно? Я знаю, что веб-сервис возвращает ArrayList. Кажется, все работает нормально, просто нет данных в ListView или ArrayList ..... Спасибо заранее!Не удается привязать объект ksoap к ArrayList в Android

РЕДАКТИРОВАТЬ: Он наделил меня тем, что данные, на которые отвечает веб-сервис, являются сложным типом. Я действительно думаю, что именно там меня повесили, но не знаю, как исправить это.

21 апреля 2010:

Так что я, наконец, понял, мой WebService возвращает массив JSON. Теперь получить это в ArrayList и/или ListView является проблемой. У меня есть ощущение, что когда-то этот проект не будет сделано, это может сделать для большой учебник или пример ...

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(); 
    } 
}; 
} 

результат выборки данных из веб-сервиса:

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

Вы можете попробовать посмотреть [учебник для ksoap, android и .NET] (http://seesharpgears.blogspot.com/2010/10/ksoap- android-web-service-tutorial-with.html) – DFDF

ответ

1

Вы должны установить адаптер в OnCreate и в handleMessage просто вызовите lv.getAdapter(). notifyDataSetChanged()

+0

Спасибо, я вижу, как это будет немного легче. Однако я все еще застрял. Код запускает блок if (Artist_Result.isEmpty()). Я должен испортить что-то между объектом мыла и ArrayList ... – Maskau