android - 没有用 ArrayList 填充 ListView

标签 android listview arraylist

我想从 ArrayList 填充一个 ListView

ArrayList 填充了正确的值。在模拟器上,我得到的是具有值的列表项

packagename ClassName@someNumber

有人遇到同样的问题吗?

    public class ExchangeMoneyMKActivity extends Activity {

    Document dom;
    private static final String METHOD_NAME = "GetExchangeRate";

    private static final String NAMESPACE = "http://www.nbrm.mk/klservice/";
    private static final String SOAP_ACTION=NAMESPACE+METHOD_NAME;
    private static final String URL = "http://www.nbrm.mk/klservice/kurs.asmx?kurs";
    ListView lw;

    ArrayList<String>currencyShortNames=new ArrayList<String>();
    ArrayList<String>currencyRates=new ArrayList<String>();
    ArrayList<ExchangeRate> currencyList=new ArrayList<ExchangeRate>();
    ArrayAdapter<ExchangeRate> aa;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        currencyShortNames.add("EUR");
        currencyShortNames.add("USD");
        currencyShortNames.add("GBP");
        currencyShortNames.add("CHF");
        currencyShortNames.add("SEK");
        currencyShortNames.add("NOK");
        currencyShortNames.add("JPY");
        currencyShortNames.add("DKK");
        currencyShortNames.add("CAD");
        currencyShortNames.add("AUD");


        lw=(ListView)this.findViewById(R.id.listView1);


        aa = new ArrayAdapter<ExchangeRate>(
                    this,android.R.layout.simple_list_item_1,
                    currencyList);
        lw.setAdapter(aa);

        callService();

    }

    private void callService() {
        try{

            SoapObject request=new SoapObject(NAMESPACE,METHOD_NAME);

            SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
            java.util.Date date = new java.util.Date();
            request.addProperty("StartDate",dateFormat.format(date));
            request.addProperty("EndDate",dateFormat.format(date));

            SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);

            envelope.dotNet=true;
            envelope.setOutputSoapObject(request);
            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            //MyXmlParserHandler parser=new MyXmlParserHandler();
            androidHttpTransport.call(SOAP_ACTION, envelope);
            SoapPrimitive  result = (SoapPrimitive) envelope.getResponse();
             String resultData = result.toString();
            // System.out.println(resultData);
            int strStart=resultData.lastIndexOf("schema");
            int strStop=resultData.lastIndexOf("dsKurs");
            int strLength=strStop-strStart-10;
            String responseXML=resultData.substring(strStart+10,strLength);
            responseXML.replace("&lt;", "<");
            responseXML.replace("&gt;", ">");
            String xmlDocument="<?xml version=\"1.0\" encoding=\"utf-8\" ?>"+
                    "<dsKurs>" +
                    responseXML + 
                    "</dsKurs>";
            System.out.println(xmlDocument);

            XMLfromString(resultData);

        }catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private void XMLfromString(String resultData) throws ParserConfigurationException, SAXException, IOException {

        // TODO Auto-generated method stub
        InputStream is = new ByteArrayInputStream(resultData.getBytes("UTF-8"));

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        DocumentBuilder db = dbf.newDocumentBuilder();
        try{
            dom = db.parse(is);
        }catch(Exception e){
            System.out.println("Fatal error");
        }

        dom.getDocumentElement();
        NodeList nl = dom.getElementsByTagName("KursZbir");
        currencyList.clear();
        if (nl != null && nl.getLength() > 0) {
            for (int i = 0 ; i < nl.getLength(); i++) {

                    Element kursZbir = (Element)nl.item(i);
                    Element sreden = (Element)kursZbir.getElementsByTagName("Sreden").item(0);
                    currencyRates.add(sreden.getFirstChild().getNodeValue());
            }
        }
        for(int i=0;i<currencyShortNames.size();i++){
            currencyList.add(new ExchangeRate(currencyShortNames.get(i).toString(),currencyRates.get(i).toString()));
            System.out.println(currencyList.get(i).shName.toString());
            System.out.println(currencyList.get(i).Currency.toString());

            aa.notifyDataSetChanged();
        }
    }
}

最佳答案

您实际上需要一个用于 ExchangeRate 的自定义 ArrayAdapter。目前,您的 ListView 不知道要显示 ExchangeRate 的哪个属性,并且可能在每个 Exchange Rate 实例上调用 .toString()

http://www.ezzylearning.com/tutorial.aspx?tid=1763429&q=customizing-android-listview-items-with-custom-arrayadapter

class ExchangeRateAdapter extends ArrayAdapter<ExchangeRate> {

    public ExchangeRateAdapter(Context context, ArrayList<ExchangeRate> rate) {
        super(context, android.R.layout.simple_spinner_item, rate);
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        ExchangeRate rate = (ExchangeRate) getItem(position);
        TextView view = new TextView(this.getContext());
        view.setTextColor(0);
        view.setHeight(30);
        view.setText(rate.getAmount());
        return view;
    }
}

然后

aa = new ExchangeRateAdapter();
list.setAdapter(aa);

在getView(..)方法中,代码专门告诉ListView显示Amount,不再显示.toString()

关于android - 没有用 ArrayList 填充 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842163/

相关文章:

java - 无法在 Android 应用程序中读取 R.Java 中的内容

c# - Listview ItemSelectionChanged 触发两次?

java - java程序调用postgresql数据库的函数

java - 预期为 : reference. 发现为 : double. 参数错误。怎么了?

android - 如何使用android获取id onclick listview

java - 当我们删除元素时,ArrayList 的容量会减少吗?

android - SwipeRefreshLayout 和 TabLayout 问题

java - 如何从地理编码器获取城市名称?

java - Android 中的 String 有长度限制吗?

java - 使用 BaseAdapter 删除 ListView 中的项目