Skocz do zawartości
KRzychu8

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

    Rekomendowane odpowiedzi

    W tym rozwiązaniu które masz nie używasz w ogóle RecyclerView, mimo że dodałeś go do swojego layoutu i zaimplementowałeś w Activity. 
    Na podstawie Twojego kodu stworzyłem poprawną implementację RecyclerView :) Po kliknięciu na przycisk "oblicz" dodają się kolejne wpisy do listy i zostają one wyświetlone na widoku w postaci listy: 
    MainActivity:

     

    package tutorial.android.com.pl.testapp;
    
    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.Button;
    import android.widget.EditText;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
    
      // w tej liście zapisywane są koszty i przebyty dystans
        List<Dane> listaDanych = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
            recycler.setLayoutManager(new LinearLayoutManager(this));
    
            final MainAdapter adapter = new MainAdapter(listaDanych);
            recycler.setAdapter(adapter);
    
    
            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);
                    Float num1 =  Float.valueOf(ilo.getText().toString());
                    Float num2 = Float.valueOf(ko.getText().toString());
                    Float sum = num1 * num2 ;
    
                    EditText km = findViewById(R.id.Km1);
                    Float km1 =  Float.valueOf(km.getText().toString());
    
                  //powstaje nowa dana do zapisania
                    Dane nowyWpis = new Dane(sum, km1);
                    listaDanych.add(nowyWpis);
                  //trzeba poinformować widok że zbiór danych się zmienił 
                    adapter.notifyDataSetChanged();
                }
    
            });
        }
    
    }

    Klasa służąca do przechowywania danych:

    package tutorial.android.com.pl.testapp;
    
    class Dane {
        Float koszt;
        Float dystans;
    
        public Dane(Float koszt, Float dystans) {
            this.koszt = koszt;
            this.dystans = dystans;
        }
    
        public Float getKoszt() {
            return koszt;
        }
    
        public void setKoszt(Float koszt) {
            this.koszt = koszt;
        }
    }

    Adapter dla ViewRecycler: 
     

    package tutorial.android.com.pl.testapp;
    
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
        private List<Dane> data;
        public MainAdapter(List<Dane> data) {
            this.data = data;
        }
    
        @Override
        public MainViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            View view = inflater.inflate(R.layout.list_item, parent, false);
            return new MainViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder( MainViewHolder holder, int position) {
            Dane daneDoWypisania = data.get(position);
    
            holder.wypiszKoszt.setText(String.valueOf(daneDoWypisania.koszt));
            holder.wypiszDystans.setText(String.valueOf(daneDoWypisania.dystans));
    
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
    
        public class MainViewHolder extends RecyclerView.ViewHolder {
            TextView wypiszKoszt;
            TextView wypiszDystans;
            public MainViewHolder(View itemView) {
                super(itemView);
                wypiszKoszt = (TextView) itemView.findViewById(R.id.wypiszKoszt);
                wypiszDystans = (TextView) itemView.findViewById(R.id.wypiszDystans);
            }
        }
    }

    Layout activity_main: 

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:background="#006696" >
    
        <TextView
            android:id="@+id/Typ"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Typ: "
            android:textSize="18sp" />
    
        <TextView
            android:id="@+id/Koszt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/Typ"
            android:layout_alignParentTop="true"
            android:layout_marginStart="0dp"
            android:layout_marginTop="85dp"
            android:text="Koszt zł/litr: "
            android:textSize="18sp" />
    
    
        <EditText
            android:id="@+id/Koszt1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_marginTop="70dp"
            android:layout_marginEnd="50dp"
            android:ems="10"
            android:inputType="numberDecimal"
            android:text="" />
    
    
        <TextView
            android:id="@+id/Ilosc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_marginTop="127dp"
            android:text="Ilosc: "
            android:textSize="18sp" />
    
        <EditText
            android:id="@+id/Ilosc1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_marginTop="110dp"
            android:layout_marginEnd="101dp"
            android:ems="10"
            android:inputType="numberDecimal"
            android:text="" />
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:layout_marginStart="186dp"
            android:layout_marginTop="204dp"
            android:text="Oblicz" />
    
        <TextView
            android:id="@+id/Km"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignStart="@+id/button"
            android:layout_alignParentBottom="true"
            android:layout_marginStart="-159dp"
            android:layout_marginBottom="453dp"
            android:text="Stan licznika: "
            android:textSize="18sp" />
    
        <EditText
            android:id="@+id/Km1"
            android:layout_width="180dp"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_alignParentEnd="true"
            android:layout_marginStart="27dp"
            android:layout_marginTop="150dp"
            android:layout_marginEnd="34dp"
            android:inputType="numberDecimal"
            android:text=" " />
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/button"
            android:layout_alignParentStart="true"
            android:layout_marginStart="0dp"
            android:layout_marginTop="22dp" />
    
    </RelativeLayout>

    list_item:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp"
        android:orientation="horizontal">
    
        <TextView
            android:id="@+id/koszt"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Koszt: " />
    
        <TextView
            android:id="@+id/wypiszKoszt"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/dystans"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Dystans" />
    
        <TextView
            android:id="@+id/wypiszDystans"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content" />
    
    </LinearLayout>

    Teraz wszystkie dane przechowywane są w liście o nazwie listaDanych i tylko tą listę należy zapisać do SharedPreferences. 
    Listy tej można używać do podliczania miesięcznych kosztów i miesięcznego dystansu. 
     

    14 godzin temu, KRzychu8 napisał:

    No i tak się stało, że stanąłem na SharedPreferences...

     Jak masz problem, dodawaj kod jaki napisałeś. Dzięki temu będziemy wiedzieć co masz źle :) 

    Udostępnij tę odpowiedź


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

    Więc tak;

    Dziękuje za to, że to Napisałeś i mi Udostępniłeś ;) 

    Mam jedną uwagę, przynajmniej nie ja, a Android Studio;

    Chodzi dokładniej o linijkę z kodem, który przedstawia się następująco:

    recycler.setLayoutManager(new LinearLayoutManager(this));

    A komunikat który daje to: 

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
            at com.domain.rzychu.myapplication.Main2Activity.onCreate(Main2Activity.java:23)

    Edit:

    Sytuacja opanowana, wystarczyło gdzieś tam pozmieniać nazwy, i teraz wszystko ładnie działa ;)

    Jeszcze raz Dziękuje

    Edytowane przez KRzychu8

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Więc tak, napiszę w tym temacie, bo to dotyczy tego...

    Aplikacja działała dobrze, gdy chciałem ja zdebugować, zaczęła się sypać, a dokładniej według programu 

    Spoiler
    
    package com.domain.rzychu.myapplication;;
    
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import java.util.List;
    
    public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MainViewHolder> {
        private List<Dane> data;
        public MainAdapter(List<Dane> data) {
            this.data = data;
        }
    
        @Override
        public MainViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            View view = inflater.inflate(R.layout.list_item, parent, false);
            return new MainViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder( MainViewHolder holder, int position) {
            Dane daneDoWypisania = data.get(position);
    
            holder.wypiszKoszt.setText(String.valueOf(daneDoWypisania.koszt));
            holder.wypiszDystans.setText(String.valueOf(daneDoWypisania.dystans));
    
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
    
        public class MainViewHolder extends RecyclerView.ViewHolder {
            TextView wypiszKoszt;
            TextView wypiszDystans;
            public MainViewHolder(View itemView) {
                super(itemView);
                wypiszKoszt = (TextView) itemView.findViewById(R.id.wypiszKoszt);
                wypiszDystans = (TextView) itemView.findViewById(R.id.wypiszDystans);
            }
        }
    }

     

    A pokazuje, 

    Spoiler
    
    --------- beginning of crash
    E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.domain.rzychu.myapplication, PID: 3292
        java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
            at com.domain.rzychu.myapplication.MainAdapter.getItemCount(MainAdapter.java:38)
            at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3834)
            at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
            at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1079)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
            at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
            at android.view.View.layout(View.java:17523)
            at android.view.ViewGroup.layout(ViewGroup.java:5612)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
            at android.view.Choreographer.doCallbacks(Choreographer.java:683)
            at android.view.Choreographer.doFrame(Choreographer.java:619)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
            at android.os.Handler.handleCallback(Handler.java:751)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6077)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
    Application terminated.

     

     

    A więc nie mam pojęcia co się stało, jednego dnia działa normalnie, a tu takie zdziwienie... nie ma nic

    I podczas wciskania tego klawisza "Oblicz..." Crashuje całą aplikacje :(

    Dodałem tylko, kilka linijek z SharedPreferences

    Spoiler
    
    package com.domain.rzychu.myapplication;
    
    
    import android.app.Activity;
    import android.content.Context;
    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;
    
    
    public class Main2Activity extends AppCompatActivity {
        EditText ilo;
        EditText ko;
        TextView dystans;
        TextView wypiszDystans;
        TextView koszt;
    
        List <Dane> listaDanych = new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            loadData();
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
            final RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler_view);
    
            recycler.setLayoutManager(new LinearLayoutManager(this));
    
            final MainAdapter adapter = new MainAdapter(listaDanych);
            recycler.setAdapter(adapter);
    
    
            EditText ilo = findViewById(R.id.Ilosc1);
            EditText ko = findViewById(R.id.Koszt1);
            TextView dystans = findViewById(R.id.dystans);
            TextView wypiszDystans = findViewById(R.id.wypiszDystans);
            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);
                    TextView dystans = findViewById(R.id.dystans);
                    TextView wypiszDystans = findViewById(R.id.wypiszDystans);
    
                    Float num1 =  Float.valueOf(ilo.getText().toString());
                    Float num2 = Float.valueOf(ko.getText().toString());
    
                    EditText km = findViewById(R.id.Km1);
                    Float km1 =  Float.valueOf(km.getText().toString());
                    Float sum = num1 * num2 ;
    
    
                    //powstaje nowa dana do zapisania
                    Dane nowyWpis = new Dane(sum, km1);
                    listaDanych.add(nowyWpis);
                    //trzeba poinformować widok że zbiór danych się zmienił
                    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 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();
        }
    
            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);
                }
    
    
        }
    
    
    

     

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Dodałeś tylko SharedPreferences. Widzę że robisz na początku loadData(). I jest tam taka linijka:

    listaDanych = gson.fromJson(json, type);

    Zakładam że na początku jeszcze nie istnieje takie SharedPreferences i pod zmienną listaDanych przypisywany jest null. Co powoduje rzucenie NullPointerException.

    Sprawdzaj czy ten json nie jest nullem. Jeżeli jest, to nie twórz z niego listy :) (gson.fromJson...)
     

    Pamiętaj też, że po każdym odinstalowaniu aplikacji SharedPreferences jest czyszczone. Chyba że ustawisz w manifeście:

    android:allowBackup="true"

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    No dobra, mniej więcej wiem jak to zrobić... 

    if (lista danych == null) { To coś tam...}

    Tylko heh... Jest jeszcze jeden powiedzmy taki większy problem... 

    Otóż, nie mogę wpisać żadnej literki w swoim kodzie...

    Chodzi o to, że aktualizowałem wersję (bo gdzieś tak wyczytałem) i na 3.3 pamiętam, że był jakiś skrót klawiszowy który mi pisanie odblokowywał...

    A teraz zaktualizowałem do wersji beta 3.4 bodajże i ten problem powrócił, może wiesz jak go rozwiązać?

    Bo wpisuje literę, i ona zaraz znika... :( 

    Udostępnij tę odpowiedź


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

    Otóż, nie mogę wpisać żadnej literki w swoim kodzie...

    Sprawdź czy w prawym dolnym rogu nie masz zamkniętej kłódki. Kliknij na nią, powinna być otwarta jak na tym rysunku:
     image.png.c317986cb7404ac8023f3b56cf8504e3.png

     

    17 godzin temu, KRzychu8 napisał:

    No dobra, mniej więcej wiem jak to zrobić... 

    if (lista danych == null) { To coś tam...}

    Bardziej  if(json != null) { to przypisz do listy danych }

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    No właśnie chodzi o to, że mam otwartą kłódkę, i dalej nic nie mogę robić... Zmieniałem z opcji Make writable na Make read-only I na odwrót i nic to nie dało... 😣

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Hmm dziwna sprawa. W najgorszym przypadku będziesz musiał usunąć całe Android Studio i od nowa przeprowadzić instalacje. Spróbuj jeszcze, na otwartym pliku, kliknąć w ikonę na górze pasku przewijania. W prawym górnym rogu. Niektórym to pomogło.

    image.png.74a6de5fac0bac179b9ce9abae92e3a4.png

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Usuwałem Android studio, już kilka razy i nic to nie dało...

    Natomiast, takiej ikonki wykrzyknika jak podałeś wyżej to nie mam... 

     

    Udostępnij tę odpowiedź


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

    Natomiast, takiej ikonki wykrzyknika jak podałeś wyżej to nie mam... 

    Chodzi o miejsce występowania ikonki. Nie musi to być wykrzyknik. Spróbuj kliknąć na ikonkę na górze paska przewijania, jaka by nie była. Może nawet nie być widoczna. 
    Co do deinstalacji Android Studio to musisz też usunąć pliki konfiguracyjne. Podczas nowej instalacji, instalator pyta czy zaczytać pliki konfiguracyjne starej wersji. Trzeba wybrać żeby nie zaczytywał.

    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ę

    • Przeglądający   0 użytkowników

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