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

Posted

技术标签:

【中文标题】在 Android 中将 ksoap 对象绑定到 ArrayList 时遇到问题【英文标题】:Having trouble binding a ksoap object to an ArrayList in Android 【发布时间】:2011-02-07 11:11:01 【问题描述】:

我正在开发一个调用 Web 服务的应用程序,然后该 Web 服务返回一个数组列表。我的问题是我无法将数据放入 ArrayList,然后在 ListView 中显示。任何想法我做错了什么?我知道 Web 服务返回一个 ArrayList 的事实。一切似乎都运行良好,只是 ListView 或 ArrayList 中没有数据.....提前致谢!

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

2010 年 4 月 21 日:

所以我终于发现我的网络服务返回一个 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>

【问题讨论】:

你可以试试看这个tutorial for ksoap, android and .NET 【参考方案1】:

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

【讨论】:

感谢 Rpond,我知道这会让事情变得更容易一些。但是我仍然卡住了。该代码正在触发 if(Artist_Result.isEmpty()) 块。我必须在肥皂对象和 ArrayList 之间搞砸了……

以上是关于在 Android 中将 ksoap 对象绑定到 ArrayList 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Ksoap2 Android - 如何为复杂对象的子属性指定命名空间?

ksoap2 将复杂对象数组发送到 WCF 服务

使用具有复杂对象的 KSoap2 调用 WCF 服务。 WCF 接收空值

在Android 中使用KSOAP2调用WebService(转)

在Android中将sql xml绑定到gridview

记一次踩坑:使用ksoap-android时造成的okhttp依赖冲突问题