Skocz do zawartości
KRzychu8

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

    Rekomendowane odpowiedzi

    W dniu 2.02.2019 o 12:16, KRzychu8 napisał:

    Edytowane poniedziałek o 11:40 przez KRzychu8
    Pętla działa :D

    Super. Wiedziałem że sobie poradzisz ;) 

    • Lubię to! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Tylko dalej się zastanawiam, jak te wyniki dodać, do shardpreferences ,  ażeby wyniki z tej pętli zostawały ? i to zaczęło sumować od tych wyników które się wyświetlają

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    @KRzychu8 Zauważ że całą listę masz już zapisaną w Sharedpreferences. Na podstawie danych z tej listy robisz obliczenia w pętli. Możesz zrobić coś takiego że po uruchomieniu aplikacji i wczytaniu listy, od razu wstawić pętle i wykonać potrzebne obliczenia dla calyKoszt  calyDystans. Czyli zrobić taką samą pętle jak po kliknięciu na przycisk.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow

    Czy Sharedpreferences jest na pewno do tego przeznaczony? Sharedpreferences ma swoje ograniczenia. Co, jeśli aplikacja rozwinie się? Wtedy cały kod szlak trafi. Proponuje przenieśc to do bazy lub do plików xml jeśli są stałem elementy listy. 

    Udostępnij tę odpowiedź


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

    @mmaciejow Heh, spokojnie w przyszłości zamierzam pobawić się w bazy SQL, lecz to jeszcze nie teraz ;)

    @Coders Lab Spróbowałem tak jak mówiłeś, być może czegoś nie zrozumiałem, ale wyszło tak i aplikacja mi się zawiesza i restartuje co chwilę ? 

    Ogólnie mój kod wygląda tak, że:

    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.Type;
    import java.util.ArrayList;
    
    import java.util.List;
    
    import static android.icu.text.DisplayContext.LENGTH_SHORT;
    
    
    public class Main2Activity extends AppCompatActivity {
        List <Dane> listaDanych = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            final TextView podlicza = findViewById(R.id.podliczz);
            final TextView dystans = findViewById(R.id.dysa);
    
            loadData();
            Float calyKoszt = 0.0f;
            Float calyDystans = 0.0f;
    
            if(podlicza != null || dystans != 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);
            }
            else {
                Intent intent = new Intent(this, Main2Activity.class);
                startActivity(intent);
            }
            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;
    
                            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();
        }
    }
    
    
    

     

    PS. Życie znając to coś w tym if-ie zepsułem ?  Najpewniej to warunek ? 

    Edit: A tak przy okazji, jak zaokrąglić liczbę do 2 miejsc po przecinku, tzn, żeby nie wychodziło mi, że np. koszt to 20.0079, tylko 20.01...?

    Edytowane przez KRzychu8
    Pytanie ?

    Udostępnij tę odpowiedź


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

    aplikacja mi się zawiesza i restartuje co chwilę

    W takich sytuacjach zawsze dodawaj logi z błędami. Wtedy łatwiej będzie zobaczyć co jest nie tak.

    16 godzin temu, KRzychu8 napisał:

    A tak przy okazji, jak zaokrąglić liczbę do 2 miejsc po przecinku, tzn, żeby nie wychodziło mi, że np. koszt to 20.0079, tylko 20.01...?

    Możesz zrobić to tak:

    String str1 = String.format("%.2f", calyKoszt);

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    A więc, dorwałem się do laptopa, i mogę pokazać co mi wyskakuje, aczkolwiek nie jest to błąd tylko powiedzmy, że coś takiego, tylko, że zapętlone:

    Spoiler
    I/hwaps: JNI_OnLoad
    W/Settings: mValues not put! needsGenerationTracker: true currentGeneration: -1 name: enable_navbar value: null
    V/AudioManager: playSoundEffect   effectType: 0
    D/HwCust: Create obj success use class android.app.HwCustActivityImpl
    D/HwCust: Create obj success use class android.app.HwCustHwWallpaperManagerImpl
    V/ActivityThread: ActivityThread,callActivityOnCreate
    D/CubicBezierInterpolator: CubicBezierInterpolator  mControlPoint1x = 0.23, mControlPoint1y = 0.06, mControlPoint2x = 0.09, mControlPoint2y = 0.97
    D/CubicBezierInterpolator: CubicBezierInterpolator  mControlPoint1x = 0.6, mControlPoint1y = 0.9, mControlPoint2x = 0.8, mControlPoint2y = 1.0
    D/CubicBezierInterpolator: CubicBezierInterpolator  mControlPoint1x = 0.23, mControlPoint1y = 0.06, mControlPoint2x = 0.09, mControlPoint2y = 0.97
        CubicBezierInterpolator  mControlPoint1x = 0.6, mControlPoint1y = 0.9, mControlPoint2x = 0.8, mControlPoint2y = 1.0
    D/HwRTBlurUtils: check blur style for HwPhoneWindow, themeResId : 0x7f0d0005, context : com.example.aplikacja.[email protected], Nhwext : 0, get Blur : disable with , null
    D/HwRTBlurUtils: check blur style for HwPhoneWindow, themeResId : 0x7f0d0005, context : com.example.aplikacja.[email protected], Nhwext : 0, get Blur : disable with , null
    I/zygote64: Do full code cache collection, code=125KB, data=95KB
    I/zygote64: After code cache collection, code=125KB, data=68KB
    D/CubicBezierInterpolator: CubicBezierInterpolator  mControlPoint1x = 0.23, mControlPoint1y = 0.06, mControlPoint2x = 0.09, mControlPoint2y = 0.97
    D/CubicBezierInterpolator: CubicBezierInterpolator  mControlPoint1x = 0.6, mControlPoint1y = 0.9, mControlPoint2x = 0.8, mControlPoint2y = 1.0
    D/CubicBezierInterpolator: CubicBezierInterpolator  mControlPoint1x = 0.23, mControlPoint1y = 0.06, mControlPoint2x = 0.09, mControlPoint2y = 0.97
        CubicBezierInterpolator  mControlPoint1x = 0.6, mControlPoint1y = 0.9, mControlPoint2x = 0.8, mControlPoint2y = 1.0
    I/zygote64: Do partial code cache collection, code=125KB, data=72KB
        After code cache collection, code=125KB, data=72KB
        Increasing code cache capacity to 512KB
    D/ActivityThread: add activity client record, r= ActivityRecord{4dd373b token=android.os.[email protected] {com.example.aplikacja/com.example.aplikacja.Main2Activity}} token= android.os.[email protected]
    D/OpenGLRenderer:   HWUI Binary is  enabled
    I/PressGestureDetector: HiTouch restricted: AboardArea.
    D/mali_winsys: EGLint new_window_surface(egl_winsys_display *, void *, EGLSurface, EGLConfig, egl_winsys_surface **, egl_color_buffer_format *, EGLBoolean) returns 0x3000
    D/OpenGLRenderer:   HWUI Binary is  enabled
    W/InputMethodManager: startInputReason = 1
    W/InputMethodManager: startInputOrWindowGainedFocus failed. Window focus may have already been lost. win=android.view.[email protected] view=android.support.v7.widget.AppCompatEditText{2a6113d VFED..CL. .F....ID 390,210-930,335 #7f080008 app:id/Koszt1},focus=true,windowFocus=true,[email protected],temporaryDetach=false
    D/HwCust: Create obj success use class android.app.HwCustActivityImpl
    D/HwCust: Create obj success use class android.app.HwCustHwWallpaperManagerImpl
    V/ActivityThread: ActivityThread,callActivityOnCreate

     

    No dobra, z tymi dwoma Stringami to działa... A jeśli chciałbym zaokrąglić wyniki w Recycler? To jest jakiś sposób na Floaty? 

    W tym momencie chodzi mi tylko o zaokrąglenie zmiennej sum, do dwóch miejsc po przecinku... ?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    @KRzychu8 Aplikacja zaczęła Ci się wieszać po dodaniu tego ifa?
     

     if(podlicza != null || dystans != null) {
                for (Dane danaZListy : listaDanych) {
                    calyKoszt = calyKoszt + danaZListy.getKoszt();
                    calyDystans = calyDystans + danaZListy.getDystans();
                }
                

    Warunek w nim jest zły. Już kiedyś zwróciłem Ci na to uwagę, jak zrobiłeś podobny. U Ciebie podliczadystans są polami na layoucie. One istnieją jeżeli dodałeś je do xmla i nie ma sensu sprawdzać czy są nulami. Tutaj powienieś sprawdzić czy listaDanych istnieje.

    Udostępnij tę odpowiedź


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

    No cóż, musiałem uwagi nie zwrócić ... Przepraszam :(

    Także będę pamiętał, aby TextView nie dodawać do if-a 

    Obecnie na sprawdzenie czy lista istnieje obmyśliłem takie coś, że:

    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.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.isEmpty()) {
      
                Intent intent = new Intent(this, Main2Activity.class);
                startActivity(intent);
            } else {
                loadData();
    
                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();
        }
    }

     

    Bo jeśli jest pusta to ma wyświetlić tylko to Activity, a jeśli coś jest to ma policzyć ?

    Ach, błąd jeszcze ;) 

    Spoiler
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.example.aplikacja, PID: 20046
        java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.aplikacja/com.example.aplikacja.Main2Activity}: java.lang.NullPointerException: Attempt to invoke interface method 'boolean java.util.List.isEmpty()' 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 interface method 'boolean java.util.List.isEmpty()' on a null object reference
            at com.example.aplikacja.Main2Activity.onCreate(Main2Activity.java:44)
            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) 

     

    Tak widziałem, że coś jest nie tak w linijce, lecz mogę się domyślać tylko, że muszę to jakoś sprawdzić, bo jest ten null ?

    Ach i istnieje/pusta dla mnie to synonimy ? 

    Edit: 

    No dobra, coś tam podziałałem i aktualnie kod wygląda tak, że zamienię go wyżej i jest także inny błąd, który też dodam wyżej ;)

    Tak nie do końca wiem o co chodzi, z Attempt to invoke interface method 'boolean java.util.List.isEmpty()' on a null object reference;

     

    Edytowane przez KRzychu8
    Coś zrobiłem :D

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    W dniu 9.02.2019 o 15:38, KRzychu8 napisał:

    Attempt to invoke interface method 'boolean java.util.List.isEmpty()' on a null object reference

    Tutaj masz informacje co poszło nie tak. Twoja lista nie została jeszcze stworzona, a Ty chcesz sprawdzić czy jest pusta. Nie możesz uzyskać informacji o czymś co jeszcze nie istnieje (jest nullem)

    Poniższy warunek nie ma sensu:

     if (listaDanych.isEmpty()) // tutaj może lecieć null
    { // jesteś już w tym activity. Nie możesz go tworzyć ponownie!
      Intent intent = new Intent(this, Main2Activity.class); 
      startActivity(intent); }

    Powinieneś zrobić według kroków:

    1. loadData() <- tylko raz! Jak będziesz chciał drugi raz wczytać to i tak to nic nie zmieni. Bo przy pierwszym uruchomieniu i tak na tej liście nic nie będzie.
    2. if(listaDanych != null) i tutaj pętla z obliczeniami.

    Te dwa kroki wystarczą ;)
     

    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