Нет заполнения ListView с ArrayList

1

Я хотел бы заполнить ListView из ArrayList.

ArrayList заполняется правильными значениями. В эмуляторе, что я получаю, элемент списка со значением

packagename КлассName @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, что отображать
  • 1
    Вы должны показать свой код - это было бы полезно
Показать ещё 2 комментария
Теги:
arraylist
listview

3 ответа

2

Вам действительно нужен пользовательский ArrayAdapter для ExchangeRate. В настоящее время ваш список не будет знать, какое свойство ExchangeRate отображать и, вероятно, вызывает.toString() для каждого экземпляра Exchange Rate

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

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.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню