Skocz do zawartości
KRzychu8

W jaki sposób podliczyć wartości oraz zresetować je w danym dniu?

    Rekomendowane odpowiedzi

    No dobrze,  poprawiłem ten bez sensowny warunek  ? i kod mi wyszedł taki:

    Spoiler
    package com.example.aplikacja;
    
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.View;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    import java.lang.reflect.Array;
    import java.lang.reflect.Type;
    import java.util.ArrayList;
    
    import java.util.List;
    
    import static android.icu.text.DisplayContext.LENGTH_SHORT;
    
    
    public class Main2Activity extends AppCompatActivity {
        private List <Dane> listaDanych = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            loadData();
    
            TextView podlicza = findViewById(R.id.podliczz);
            TextView dystans = findViewById(R.id.dysa);
    
            Float calyKoszt = 0.0f;
            Float calyDystans = 0.0f;
    
            if (listaDanych != null ) {
                for(Dane danaZListy: listaDanych) {
                    calyKoszt = calyKoszt + danaZListy.getKoszt();
                    calyDystans = calyDystans + danaZListy.getDystans();
                }
                String str1 = calyKoszt.toString();
                podlicza.setText(str1);
    
                String str2 = calyDystans.toString();
                dystans.setText(str2);
            }
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            final RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler_vi);
    
            recycler.setLayoutManager(new LinearLayoutManager(this));
    
            final MainAdapter adapter = new MainAdapter(listaDanych);
            recycler.setAdapter(adapter);
    
            TextView koszt = findViewById(R.id.koszt);
            Button button = (Button)findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    EditText ilo = findViewById(R.id.Ilosc1);
                    EditText ko = findViewById(R.id.Koszt1);
                    EditText pole = findViewById(R.id.Km1);
    
    
                    if ( ko.getText().toString().isEmpty() || ilo.getText().toString().isEmpty()) {
                        Toast toast = Toast.makeText(getApplicationContext(), "Wprowadź poprawne dane", Toast.LENGTH_SHORT);
                        toast.show();
                    }
                    else if (pole.getText().toString().isEmpty()) {
                        Toast toast = Toast.makeText(getApplicationContext(), "Wprowadź poprawne dane", Toast.LENGTH_SHORT);
                        toast.show();
                    }
                    else if (pole.equals("")) {
                        Toast toast = Toast.makeText(getApplicationContext(), "Wprowadź ", Toast.LENGTH_SHORT);
                        toast.show();
                    }
    
                    else {
                        Float km1 = Float.valueOf(pole.getText().toString());
                        Float num1 = Float.valueOf(ilo.getText().toString());
                        Float num2 = Float.valueOf(ko.getText().toString());
                        Float sum = num1 * num2;
                        TextView podlicza = findViewById(R.id.podliczz);
                        TextView dystans = findViewById(R.id.dysa);
    
                        Dane nowyWpis = new Dane(sum, km1);
                        listaDanych.add(nowyWpis);
    
                        Float calyKoszt = 0.0f;
                        Float calyDystans = 0.0f;
    
                        for(Dane danaZListy: listaDanych) {
                            calyKoszt = calyKoszt + danaZListy.getKoszt();
                            calyDystans = calyDystans + danaZListy.getDystans();
                        }
                        String str1 = calyKoszt.toString();
                        podlicza.setText(str1);
    
                        String str2 = calyDystans.toString();
                        dystans.setText(str2);
    
                        adapter.notifyDataSetChanged();
                        saveData();
                    }
                }
    
            });
    
            Button button_reset = findViewById(R.id.button5);
            button_reset.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listaDanych.clear();
                    saveData();
                }
            });
        }
    
        private void loadData() {
            SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
            Gson gson = new Gson();
            String json = sharedPreferences.getString("task list", null);
            Type type = new TypeToken<ArrayList<Dane>>() {}.getType();
            listaDanych = gson.fromJson(json, type);
    
    
            if (json != null) {
                SharedPreferences.Editor editor = sharedPreferences.edit();
                json = gson.toJson(listaDanych);
                editor.putString("task list", json);
                editor.apply();
            }
            else {
                Intent intent = new Intent(this, Main2Activity.class);
                startActivity(intent);
            }
        }
        private void saveData() {
            SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            Gson gson = new Gson();
            String json = gson.toJson(listaDanych);
            editor.putString("task list", json);
            editor.apply();
        }
    }

     

    A więc, zmieniłem warunek w If-ie na taki z sensem ;) 

    Lecz, błędów nie da się ustrzec :( 

    Spoiler
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.aplikacja, PID: 26159
        java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
            at com.example.aplikacja.MainAdapter.getItemCount(MainAdapter.java:38)
            at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3834)
            at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3330)
            at android.view.View.measure(View.java:22216)
            at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
            at android.view.View.measure(View.java:22216)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
            at android.view.View.measure(View.java:22216)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
            at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401)
            at android.view.View.measure(View.java:22216)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at android.view.View.measure(View.java:22216)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1539)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:823)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:702)
            at android.view.View.measure(View.java:22216)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6671)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
            at com.android.internal.policy.DecorView.onMeasure(DecorView.java:831)
            at android.view.View.measure(View.java:22216)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2589)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1631)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1885)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1515)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7266)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:981)
            at android.view.Choreographer.doCallbacks(Choreographer.java:790)
            at android.view.Choreographer.doFrame(Choreographer.java:721)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:967)
            at android.os.Handler.handleCallback(Handler.java:808)
            at android.os.Handler.dispatchMessage(Handler.java:101)
            at android.os.Looper.loop(Looper.java:166)
            at android.app.ActivityThread.main(ActivityThread.java:7425)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

     

    Przynajmniej nie boolean, ale int... Czy te błędy z tym boolean i int dotyczą tego samego zawsze?

    W sensie, że jak był boolean to ten zły warunek w if-ie, a jeśli int to gdzieś muszę dodać if-a?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Funkcja loadData() robi dziwne rzeczy:

     

        private void loadData() {
            SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
            Gson gson = new Gson();
            String json = sharedPreferences.getString("task list", null);
            Type type = new TypeToken<ArrayList<Dane>>() {}.getType();
          
          //Przypisujesz do listy nulla! ten sam błąd co 20 stycznia
            listaDanych = gson.fromJson(json, type);
    
    
            if (json != null) {
                SharedPreferences.Editor editor = sharedPreferences.edit();
              //teraz do jsona zapisujesz nulla
                json = gson.toJson(listaDanych);
                editor.putString("task list", json);
                editor.apply();
            }
            else {
              // zapętlasz otwieranie tej samej Activity. Już jesteś przecież w niej, nie możesz tak robić
                Intent intent = new Intent(this, Main2Activity.class);
                startActivity(intent);
            }
        }

    Powinieneś mieć coś takiego:

        private void loadData() {
            SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
            Gson gson = new Gson();
            String json = sharedPreferences.getString("task list", null);
            Type type = new TypeToken<ArrayList<Dane>>() {}.getType();
          
            if (json != null) {
              listaDanych = gson.fromJson(json, type);
            }
        }

    Namieszałeś sobie sporo ;) Miałeś dobrą wersję, pododawałeś wiele rzeczy i nie usunąłeś tych niepotrzebnych. Na pocieszenie powiem Ci że każdy taki etap przechodził :P
    Czas się zaprzyjaźnić z GITem. Tam Ci dobra wersja kodu nie zaginie :D

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    No to skoro każdy taki etap przechodził, to jestem wielce uradowany :D 

    A co oznacza:

    2 godziny temu, Coders Lab napisał:

    Czas się zaprzyjaźnić z GITem. Tam Ci dobra wersja kodu nie zaginie :D

    Ach, i nie będę wstawiał całego kodu iż gdyż, na moje to problem jest tylko z pętlą i nie ma żadnego błędu :D 

    Spoiler
    
            loadData();
    
            TextView podlicza = findViewById(R.id.wynikkoszt);
            TextView dystans = findViewById(R.id.wynikdystans);
    
            Float calyKoszt = 0.0f;
            Float calyDystans = 0.0f;
            String str1 = calyKoszt.toString();
            String str2 = calyDystans.toString();
    
            if (listaDanych != null ) {
                for(Dane danaZListy: listaDanych) {
                    calyKoszt = calyKoszt + danaZListy.getKoszt();
                    calyDystans = calyDystans + danaZListy.getDystans();
                }
                if (str1.isEmpty() || str2.isEmpty()) {
                    podlicza.setText(str1);
                    dystans.setText(str2);
                }
            }

     

    Ta cała moja pętla, wygląda tak... a ten drugi if jest po to, bo jakiś Null wywalało, i sobie poradziłem :D 

    Activity prawie działa, tylko znika sumowanie :( 

    Mam nadzieję, że do zmiennych typu String jest to .isEmpty()  ;)  Przy null nawet się nie włącza, więc to chyba to :P 

    Aleeee, życie znając to pewnie znowu warunek ? :( 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    10 godzin temu, KRzychu8 napisał:

    Activity prawie działa, tylko znika sumowanie :(

    Znika sumowanie to znaczy że zawsze wychodzi: 0.0? :P 

    Przed pętlą robisz coś takiego:

    String str1 = calyKoszt.toString(); //koszt przed pętlą wynosi 0
    String str2 = calyDystans.toString(); // dystans przed pętlą też wynosi 0

    a po pętli:

    podlicza.setText(str1); //str1 ustawiłeś przed pętlą z kosztu który wyniósł 0, zatem wyświetli Ci się również 0
    dystans.setText(str2);  // to samo co wyżej ;-)

    Czyli to co działo się w pętli nie zostało nigdzie przypisane. Musisz zamianę na string przenieść za pętle.

    10 godzin temu, KRzychu8 napisał:

    A co oznacza:

    13 godzin temu, Coders Lab napisał:

    Czas się zaprzyjaźnić z GITem. Tam Ci dobra wersja kodu nie zaginie :D

    Wstawiłem jako odnośnik. Możesz kliknąć na GITem i przeniesie Cię do strony z wyjaśnieniem ;) 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    13 godzin temu, Coders Lab napisał:

    Czyli to co działo się w pętli nie zostało nigdzie przypisane. Musisz zamianę na string przenieść za pętle.

    No dobrze, to teraz zobaczymy czy się dobrze zrozumieliśmy :

    Spoiler
    loadData();
    
            TextView podlicza = findViewById(R.id.wynikkoszt);
            TextView dystans = findViewById(R.id.wynikdystans);
    
            Float calyKoszt = 0.0f;
            Float calyDystans = 0.0f;
    
    
            if (listaDanych != null ) {
                for(Dane danaZListy: listaDanych) {
                    calyKoszt = calyKoszt + danaZListy.getKoszt();
                    calyDystans = calyDystans + danaZListy.getDystans();
                }
                String str1 = calyKoszt.toString();
                String str2 = calyDystans.toString();
    
                if (str1.isEmpty() || str2.isEmpty()) {
                    podlicza.setText(str1);
                    dystans.setText(str2);
                }
            }

     

    Tak jak pisałem drugi If, po to bo wywalało nulla...

    Wydaje mi się, że w inne miejsce tej zamiany na string nie mogłem dodać... A jeśli się mylę, to Możesz mnie Poprawić ;)

    Ale wiem, że coś dalej jest nie tak, bo jak Pisałeś, dalej mi pokazuje 0 ? 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    21 godzin temu, KRzychu8 napisał:

    if (str1.isEmpty() || str2.isEmpty())

    Sprawdź co tutaj się dzieje ;) str1 nie jest pusty i  str2 też nie jest pusty. Bo ustawiasz je chwilę wcześniej. Zatem nigdy nie zostaną wykonane poniższe linie:

    21 godzin temu, KRzychu8 napisał:

    podlicza.setText(str1);
    dystans.setText(str2);

    Czyli ten warunek jest zbędny.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Dla mnie tak nie do końca zbędny, iż gdyż nie ma tego warunku wyskakuje mi :

    Spoiler
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.aplikacja, PID: 1573
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aplikacja/com.example.aplikacja.Main2Activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
            at android.app.ActivityThread.-wrap12(Unknown Source:0)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
            at android.os.Handler.dispatchMessage(Handler.java:108)
            at android.os.Looper.loop(Looper.java:166)
            at android.app.ActivityThread.main(ActivityThread.java:7425)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
         Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
            at com.example.aplikacja.Main2Activity.onCreate(Main2Activity.java:55)
            at android.app.Activity.performCreate(Activity.java:7372)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 
            at android.app.ActivityThread.-wrap12(Unknown Source:0) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 
            at android.os.Handler.dispatchMessage(Handler.java:108) 
            at android.os.Looper.loop(Looper.java:166) 
            at android.app.ActivityThread.main(ActivityThread.java:7425) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) 

     

    I to właśnie odnosi, się do tego 

    podlicza.setText(str1);

    Więc i prawdopodobnie potem do: 

    dystans.setText(str2);

    Chyba, że trzeba użyć coś innego...

    A pętla wygląda tak: 

    Spoiler
    loadData();
    
            TextView podlicza = findViewById(R.id.wynikkoszt);
            TextView dystans = findViewById(R.id.wynikdystans);
    
            Float calyKoszt = 0.0f;
            Float calyDystans = 0.0f;
    
    
            if (listaDanych != null ) {
                for(Dane danaZListy: listaDanych) {
                    calyKoszt = calyKoszt + danaZListy.getKoszt();
                    calyDystans = calyDystans + danaZListy.getDystans();
                }
                String str1 = calyKoszt.toString();
                String str2 = calyDystans.toString();
    
                podlicza.setText(str1);
                dystans.setText(str2);
            }

     

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    str1 i str2 nie są nullami. Wyjątek mówi o tym że Twoje pole podlicza jest nullem. Czy aby na pewno prawidłowo je znajdujesz?

    10 godzin temu, KRzychu8 napisał:

    TextView podlicza = findViewById(R.id.wynikkoszt);
    TextView dystans = findViewById(R.id.wynikdystans);

    Bo wcześniej miałeś tak:

    TextView podlicza = findViewById(R.id.podlicz);

    Na pewno w xmlu z layoutem masz TextView o id wynikkoszt? Czy raczej podlicz? :P 

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Najpewniej mam tak i tak...

    Ale przyjadę do domu, to napiszę jak na prawdę mam... ???

     

    Edit:

    Textview ,mam zapisane jako:

    TextView podlicza = findViewById(R.id.wynikkoszt);
    TextView dystans = findViewById(R.id.wynikdystans);

    Zmieniłem pewnie, żeby było mi łatwiej się połapać ;)

    Aczkolwiek, mam też to podlicz jako TextView, tylko, że ono wyświetla napis Suma: ;)  I w sumie to nie jest ono nigdzie używane tylko do wyświetlania tego napisu ?  i już usunąłem 

    TextView podlicza = findViewById(R.id.podlicz);

    Chodzi o ten ;) 

    A chce to wypisać do wynikkoszt i wynikdystans ;) 

    Taaa, pogmatwałem trochę :P 

    Edytowane przez KRzychu8
    Już wiem ;)

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    W dniu 14.02.2019 o 11:27, KRzychu8 napisał:

    Już wiem ;) 

    Czyli już wszystko działa tak jak trzeba?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x