2012-05-31 147 views
1

我想從ArrayList填充ListView無法使用ArrayList填充ListView

ArrayList填寫正確的值。在模擬器上,我得到的是,與價值

列表項目包名類名@ 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(); 
     } 
    } 
} 
+0

這就像你需要一個ListAdapter。這是一種告訴ListView要顯示的內容的方法 – codingbiz

+1

您需要顯示代碼 - 這將有助於 – codingbiz

+0

發佈您正在使用的代碼,並在可能的情況下顯示當前輸出的屏幕截圖。 – FoamyGuy

回答

0
ListView myListView = (ListView) findViewById(R.id.myListView); 

    listAdapter = new ArrayAdapter<String>(this, 
         android.R.layout.simple_list_item_1, 
         myArrayList); 
    myListView.setAdapter(listAdapter); 
2

實際上您需要EXCHANGERATE定製ArrayAdapter。目前,您的列表視圖不知道,以顯示其EXCHANGERATE的財產,並可能在Exchange的每個實例調用的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顯示金額並且不再存在.toString()

0

框中沒有任何東西這是。但是,我創建了自己的ListAdapater版本,它實現了java.util.List,並允許您將java.util.List的任何實現設置到其中。本質上,它是這樣工作的:

public class abstract ListAdapter<T> extends BaseAdapter implements List<T> { 

    List<T> list; 

    public ListAdapter(List<T> contents) { 
     list = contents; 
    } 

    public int getCount() { 
     return list.size(); 
    } 

    public T getItem(int i) { 
     return list.get(i); 
    } 

    public long getItemId(int i) { 
     return i; 
    } 

    public int size() { 
     return list.size(); 
    } 

    public boolean isEmpty() { 
     return list.isEmpty(); 
    } 

    public boolean contains(Object o) { 
     return list.contains(o); 
    } 

    public boolean addAll(Collection<? extends T> c) { 
     boolean result = list.addAll(c); 
     notifyDataSetChanged(); 
     return result; 
    } 

    // so on and so on essentially delegating every method in List 
    // interface to the underlying list. Of course mutators will have to call 
    // notifyDataSetChanged() 
} 

我也有其他幾個改進,使之更容易創建和使用視圖回收的規定機制很好地結合到視圖。所以你實現了createView()和bindView()而不是實現getView()。

最後,它使創建靈活的列表管理單元:

public void onCreate(Bundle saved) { 

    ListAdapter<String> adapter = new ListAdapater<String>() { ... }; 
    adapter.add("Foo"); 
    adapter.add("Bar"); 
    adapter.add("BaZ"); 

    listView.setAdapter(adapter); 
} 

它遠遠超過任何開箱的Android的生產力。