在Android中将ksoap对象绑定到ArrayList时遇到问题

在Android中将ksoap对象绑定到ArrayList时遇到问题,android,web-services,json,arraylist,ksoap2,Android,Web Services,Json,Arraylist,Ksoap2,我正在开发一个调用web服务的应用程序,然后web服务返回一个数组列表。我的问题是无法将数据放入ArrayList,然后在ListView中显示。你知道我做错了什么吗?我知道web服务返回一个ArrayList。一切似乎都很正常,只是ListView或ArrayList中没有数据……提前谢谢 编辑:我觉得Web服务响应的数据是复杂类型的。我真的认为这就是我被挂断的地方,但不知道如何纠正它 2010年4月21日: 所以我最终发现我的Web服务返回一个JSON数组。现在,将其转移到ArrayList

我正在开发一个调用web服务的应用程序,然后web服务返回一个数组列表。我的问题是无法将数据放入ArrayList,然后在ListView中显示。你知道我做错了什么吗?我知道web服务返回一个ArrayList。一切似乎都很正常,只是ListView或ArrayList中没有数据……提前谢谢

编辑:我觉得Web服务响应的数据是复杂类型的。我真的认为这就是我被挂断的地方,但不知道如何纠正它

2010年4月21日:

所以我最终发现我的Web服务返回一个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();
    }
};
}
package com.maskau;
导入java.util.ArrayList;
导入org.ksoap2.SoapEnvelope;
导入org.ksoap2.serialization.PropertyInfo;
导入org.ksoap2.serialization.SoapObject;
导入org.ksoap2.serialization.SoapSerializationEnvelope;
导入org.ksoap2.transport.AndroidHttpTransport;
导入android.app.*;
导入android.os.*;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.TextView;
导入android.view.view;
导入android.view.view.OnClickListener;
公共类Home extends活动实现可运行{
/**在首次创建活动时调用*/
公共静态最终字符串SOAP_ACTION=”http://bb.mcrcog.com/GetArtist";
公共静态最终字符串方法\u NAME=“GetArtist”;
公共静态最终字符串命名空间=”http://bb.mcrcog.com/";
公共静态最终字符串URL=”http://bb.mcrcog.com/karaoke/service.asmx";
字符串wt;
公共静态程序设计;
TextView text1;
ListView lv;
静态编辑文本;
静态按钮,但;
private ArrayList Artist_Result=new ArrayList();
@凌驾
创建公共空间(捆绑冰柱){
超级冰柱;
setContentView(R.layout.main);
myEditText=(EditText)findViewById(R.id.myEditText);
text1=(TextView)findViewById(R.id.text1);
lv=(ListView)findViewById(R.id.lv);
但是=(按钮)findViewById(R.id.but);
但是.setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
wt=(“搜索“+myEditText.getText().toString());
text1.setText(“”);
pd=ProgressDialog.show(Home.this,“工作…”),wt,true,false);
线程线程=新线程(Home.this);
thread.start();
}
}
);
}
公开募捐
{
尝试
{
SoapObject请求=新的SoapObject(名称空间、方法名称);
PropertyInfo pi=新的PropertyInfo();
pi.setName(“ArtistQuery”);
setValue(Home.myEditText.getText().toString());
请求。添加属性(pi);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
AndroidHttpTransport at=新的AndroidHttpTransport(URL);
at.call(SOAP_动作、信封);
java.util.Vector rs=(java.util.Vector)envelope.getResponse();
如果(rs!=null)
{
用于(对象cs:rs)
{
艺术家_Result.add(cs.toString());
}
}
}
捕获(例外e)
{
//添加了这一行,运行时抛出“org.ksoap2.serialization.SoapObject”
艺术家_Result.add(e.getMessage());
}
handler.sendEmptyMessage(0);
}
私有处理程序=新处理程序()
{
@凌驾
公共无效handleMessage(消息消息消息)
{
ArrayAdapter aa;
aa=新的ArrayAdapter(Home.this,android.R.layout.simple\u list\u item\u 1,Artist\u Result);
低压设置适配器(aa);
尝试
{
if(Artist_Result.isEmpty())
{
text1.setText(“无结果”);
}
其他的
{
text1.setText(“完整”);
setText(“搜索艺术家”);
}
}
捕获(例外e)
{
text1.setText(如getMessage());
}
aa.notifyDataSetChanged();
pd.解散();
}
};
}
来自webservice的示例结果数据:

<ArrayOfArtists>
    <Artist>
        <Track>.......</Track>
    </Artist>
    <Artist>
        <Track>.......</Track>
    </Artist>
    <Artist>
        <Track>.......</Track>
    </Artist>
</ArrayOfArtists>

.......
.......
.......

您应该在onCreate和handleMessage中设置适配器,只需调用lv.getAdapter().notifyDataSetChanged()

谢谢,我可以看到这会使事情变得更简单。但是我还是被卡住了。代码正在触发if(Artist_Result.isEmpty())块。我必须搞乱soap对象和ArrayList之间的某些地方…你可以试试看这个