List.SetAdapter w innej klasie

0

Witam serdecznie ! !
O to Ja i kolejny problem :D
Zrobiłem Button, który po kliknięciu wywołuję metodę z klasy odpowiedzialnej za połączenie z Web Service Klientem, która dziedziczy po AsyncTask. Web Service zwraca mi XML, który następnie w postaci Stringa leci do metody, która potrzebne mi dane wrzuca do ArrayListy obiektów (obiekt ma 2 pola stringi). I teraz pojawia się problem bo Te wszystkie metody wywołuję w doInBackground i również Tutaj chcę wrzucić tą ArrayListę obiektów do ListView z mojego MainActivity. Nie wiem czy to dobry pomysł, czy lepiej zrobić oddzielną klasę do dodawania informacji do MainActivity. Ale nie w tym rzecz...
Jak prawidłowo dodać z innej klasy ArrayListę do ListView?? Albo nawet zwykły string do TextView?? Wiem, że można stworzyć klasę adaptera i wywołać jej obiekt w MainActivity a następnie przekazać ConvertView i za jego pomocą dodać listę do ListView, ale Ja chcę dodać ją z poziomu Klasy, która nie jest Activity.
Udało mi się napisać kod, który zmienia zawartość TextView z poziomu innej klasy (i zmiana jest widoczna na telefonie), ale potem mi wywala błąd i zamyka aplikację, także robię coś źle.
Poza tym moja Lista jest stworzona z obiektów, które składają się z 2 pól. Jak prawidłowo dodaję się listę z X pól do ListView?

Mam nadzieję, że problem opisałem dość jasno. O to kod samego doInBackground (myślę że tylko to jest istotne):

	protected Object doInBackground(Object... arg0) {
        String s = Send(); // metoda która pobiera xml z Webservice
        XmlHelper xmlHelp = new XmlHelper(); // 
        
        ArrayList<EventB> array_events = xmlHelp.GetEvents(s); // metoda która wrzuca dane z XML do Arraya i zwraca Array obiektów

    	ArrayAdapter<EventB> adapter ;  
        TextView txt = (TextView)((Activity) this.context).findViewById(R.id.textView1);
        ListView list = (ListView)((Activity) this.context).findViewById(R.id.ListEvents);
        adapter = new ArrayAdapter<EventB>((Activity) this.context, R.layout.event_element, array_events);
        list.setAdapter(adapter);
        txt.setText("Aktualne Eventy:");
      
		return null;
	}

Błąd "Only the original thread that created a view hierarchy can touch its views"

EDIT!!
Ewentualnie mógłbym zwrócić z doInBackground Stringa, a potem z MainActivity wywołać metodę przerobienia go na ArrayListę, ale nie wiem czy można zwracać Stringa, poza tym doInBackground chodzi w tle =/.

0

Nie można aktualizować UI w metodzie doInBackground(). Użyj w tym celu metody onPostExecute(Result), gdzie Result to jest to co zwraca metoda doInBackground();

0

Print screen :
http://prntscr.com/3hlfar

	protected void onPostExecute(String result) {
		XmlHelper xmlHelp = new XmlHelper();
		 
		switch (command) {
	        case "GetEvents":
	        	ArrayList<EventB> array_events = xmlHelp.GetEvents(result);
	        	ArrayAdapter<String> adapter ;  
	        	
	            TextView txt = (TextView) act.findViewById(R.id.textView1);
	            ListView list = (ListView) act.findViewById(R.id.ListEvents);
	            txt.setText("Aktualne Eventy:");
	            //adapter = new ArrayAdapter<EventB>((Activity) this.context, R.layout.event_element, array_events);
	            String cars[] = {"Mercedes", "Fiat", "Ferrari", "Aston Martin", "Lamborghini", "Skoda", "Volkswagen", "Audi", "Citroen"};
	            
	            ArrayList<String> carL = new ArrayList<String>(); 
	            carL.addAll( Arrays.asList(cars) ); 
	     
	            adapter = new ArrayAdapter<String>(act, R.layout.event_element, carL);
	            list.setAdapter(adapter);
	          break;
	     
	        case "GetImage":
	          break;
	        }
    }
	
	@Override
	protected Object doInBackground(Object... arg0) {
        String s = Send();
		return s;
	}

Dobrze prawda? ? a nie działa

0

Ale co konkretnie nie działa? Gdzie stawiales breakpointy jak debugowales? Leca jakies komunikaty o bledach?

0

Zrobiłem....
ROZWIĄZANIE:

@Override
	protected String doInBackground(Object... arg0) {
        String s = Send();
		return s;
	}

.....
Przepraszam Was ale wykorzystam temat :P Mam jeszcze pytanie co do wrzucania ArrayListy obiektów. ScreenShot podglądu mojego Arraya:
http://prntscr.com/3hm71i

Wrzuca mi się do ListView "com.example.newhotproject.Event", a chciałbym żeby wrzucały się elementy Arraya. Jak to zrobić? Proszę o tutka cokolwiek co by mi pomogło.

ArrayList<EventB> array_events = xmlHelp.GetEvents(result);
	        	ArrayAdapter<EventB> adapter;  
	            TextView txt = (TextView) act.findViewById(R.id.textView1);
	            ListView list = (ListView) act.findViewById(R.id.ListEvents);
	            txt.setText("Aktualne Eventy:");
	            adapter = new ArrayAdapter<EventB>(act, R.layout.event_element, array_events);
	            list.setAdapter(adapter);
1

Elementy arraya tzn co? ArrayAdapter domyślnie wywołuje toString() na obiektach, które przechowuje. Zatem podejścia masz dwa: nadpisać metodę toString() w klasie EventB tak aby zwracała coś bardziej 'user-friendly', np w tym przypadku name. Albo napisać własny adapter dla EventB dziedziczący po ArrayAdapter i nadpisać metodę getView() wg własnego uznania. W drugim przypadku pamiętaj o ViewHolder pattern!

0

Bolson dzięki za wsparcie !
Pierwszy sposób działa i jest ok! Ale jeśli elementy listy będą składały się z obrazka i kilku informacji to rozumiem, że odpada? Nad drugim jeszcze popracuje.

Pozdrawiam !

0 użytkowników online, w tym zalogowanych: 0, gości: 0