Android: Zawartość Arraylisty z jednej klasy do ListView w drugiej klasie.

0

Witam

Mam takie pytanie, czy pomoże mi ktoś z rozwiązaniem problemu. Chodzi o wyświetlenie zawartości jednej, dwóch arraylist z klasy Trackera w klasie Activity w obiekcie ListView. Obie te rzeczy mam już gotowe, kwestia tylko ich wyświetlenia.
W klasie Trackera w metodzie OnLocationChanged jest obliczanie dystansu pomiędzy dwoma lokalizacjami (obecną usera i statyczną), gdy jest ona mniejsza bądź równa 50 metrów to chciałbym, aby w tym momencie z listy nazw ( lista "spisName") oraz dystans do tych lokacji zapisać do listview. W klasie aktywności istnieje już listview z testowymi danymi statycznymi.
Prosiłbym o jakąś pomoc. Dołączam kody źródłowe obu klas.

Tracker: http://wklej.org/hash/085306d931a/
Activity: http://wklej.org/hash/8deb5438004/

Z góry dziękuję.

0

A gdybyś zrobił w klasie Tracker zrobił metody do zwracania tych danych i dzięki temu mógł pobrać je z obiektu w klasie Activity?

0

Zawsze możesz te dane wrzucać do bazy danych.

Stworzyć DB Helpera, Managera bazy danych (pośrednik między insertem i selectem) i zaciągać te dane w Activity.

I wydaje się to najlepszym rozwiązaniem.

Drugi sposób:
Ponieważ ArrayLista jest serializowana mógłbyś też przekazywać ją w Bundle przy pomocy onActivityResult.

0

Jeśli dobrze rozumiem problem sprowadza się do komunikacji service -> activity.

Możesz użyć do tego Broadcast Recievera aby w określonych warunkach przekazać dane z service do activity.

tutaj przykład http://www.vogella.com/tutorials/AndroidServices/article.html#servicecommunication_bundle

0

Zrobiłem to na takiej zasadzie. W klasie Trackera zapisuje mi z bazy do listy nazwy obiektów:

 db = new DatabaseHandler(context); //laczymy sie z baza
        lokalizacje = db.getAllLocation();// pobieramy wszystkie lokalizacje z bazy
        if (!lokalizacje.isEmpty() && lokalizacje!=null) { 
            for (Lokalizacje lok : lokalizacje) { 
               
                String newDesc = lok.getDescription();
                String newName = lok.getLocation();
                spisDesc.add(newDesc);
                spisName.add(newName);

Później w metodzie OnLocationChanged() przy warunku, gdy dystans jest mniejszy bądź równy 50 pobiera z Listy elementy i przesyła z serwisu do aktywności FullscreenActivity:

public void onLocationChanged(Location location) {
       
        for(int i=0; i < spisLat.size();i++) {

            double LatEnd =  spisLat.get(i);
            double LongEnd = spisLon.get(i);

            Location staticLoc = new Location("Static");
            staticLoc.setLatitude(LatEnd);
            staticLoc.setLongitude(LongEnd);

            double distance = location.distanceTo(staticLoc);
            String d = Double.toString(distance);        

            if (distance <= 50)
            {
                String a = spisDesc.get(i);  // opis miejscowek
                String b = spisName.get(i); //nazwy miejsc
                Log.d("Nazwa", b);

                    Intent mIntent = new Intent(this, FullscreenActivity.class);
                    Bundle extras = mIntent.getExtras();
                    extras.putString("new", b);

W klasie aktywności odbieranie i zapis do ListView wygląda tak:

String locations;
//(...)
 list = (ListView) findViewById(R.id.listView1);
        Intent myIntent = getIntent(); 
        if (myIntent !=null && myIntent.getExtras()!=null){
            locations = myIntent.getExtras().getString("new");
            ArrayList<String> Lista = new ArrayList<String>();
            Lista.addAll( Arrays.asList(locations) );
            adapter = new ArrayAdapter<String>(this, R.layout.row, Lista);
            list.setAdapter(adapter);
            }

Gdy tylko dystans spełnia warunek w "<=50" wywala apkę, a w logu zgłasza błąd NullPointerExcepction:
//java.lang.NullPointerException
at android.content.ContextWrapper.getPackageName(ContextWrapper.java:135)
at android.content.ComponentName.<init>(ComponentName.java:77)
at android.content.Intent.<init>(Intent.java:3813)
at com.example.michal.mobilnyprzewodnik.GPSTracker.onLocationChanged(GPSTracker.java:238)
at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:279)
at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:208)
at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:224)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)//

Mógłby mi ktoś pomóc naprawić ten błąd ?

0
  at com.example.michal.mobilnyprzewodnik.GPSTracker.onLocationChanged(GPSTracker.java:238)

Sprawdź linię nr 238 w pliku GPSTracker.java. Tam leci Ci NPE. Wepnij się debuggerem, sprawdź, co dokładnie jest nullem i wyeliminuj tę sytuację.

Najlepiej unikaj null-checków i przekazywania nulli, jeśli nie zmusza Cię do tego API. Możesz skorzystać np. w Null Object Pattern.

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