0

The app runs fine at the first run after deleting previous data. It crashes when it runs second time and has to take saved info from sharedprefs (I saved it with HashSets).

SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.adam.vaistai", Context.MODE_PRIVATE);

HashSet<String> set = (HashSet<String>) sharedPreferences.getStringSet("names", null);

HashSet<String> numberSet = (HashSet<String>) sharedPreferences.getStringSet("numbers", null);

HashSet<String> descSet = (HashSet<String>) sharedPreferences.getStringSet("desc", null);

if (set == null){
    vaistai.add("Pavyzdys 2017-08-18");
    numbers.add(String.valueOf(0));
    description.add("Nuo persalimo, vartoti 3 kartus dienoje");

} else {

    vaistai = new ArrayList<>(set);
    //error
    numbers = new ArrayList<>(numberSet);
    description = new ArrayList<>(descSet);

}

Using logs I found out that the app crashes after line (vaistai = new ArrayList<>(set);)

08-26 17:11:00.745 7730-7730/com.example.adam.vaistai E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.example.adam.vaistai, PID: 7730
                                                                    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.adam.vaistai/com.example.adam.vaistai.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference

logcat shows this

Thats the code of MainActivity.java

package com.example.adam.vaistai;

import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

ListView listView;

static ArrayList<String> vaistai = new ArrayList<>();
static ArrayList<String> numbers = new ArrayList<>();
static ArrayList<String> description = new ArrayList<>();

static ArrayAdapter arrayAdapter;


public void nextActivity (int pos){

    Intent intent = new Intent(this, SecondActivity.class);

    intent.putExtra("index", pos);

    startActivity(intent);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater menuInflater = getMenuInflater();

    menuInflater.inflate(R.menu.main_menu, menu);

    return super.onCreateOptionsMenu(menu);

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    super.onOptionsItemSelected(item);

    if (item.getItemId() == R.id.newNote){

        vaistai.add("");
        numbers.add(String.valueOf(0));
        description.add("");

        arrayAdapter.notifyDataSetChanged();

        nextActivity(vaistai.size()-1);
    }
    return false;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.listView);

    SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.adam.vaistai", Context.MODE_PRIVATE);

    HashSet<String> set = (HashSet<String>) sharedPreferences.getStringSet("names", null);

    HashSet<String> numberSet = (HashSet<String>) sharedPreferences.getStringSet("numbers", null);

    HashSet<String> descSet = (HashSet<String>) sharedPreferences.getStringSet("desc", null);

    if (set == null){
        vaistai.add("Pavyzdys 2017-08-18");
        numbers.add(String.valueOf(0));
        description.add("Nuo persalimo, vartoti 3 kartus dienoje");

    } else {

        vaistai = new ArrayList<>(set);
        numbers = new ArrayList<>(numberSet);
        description = new ArrayList<>(descSet);

    }

    arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, vaistai);

    listView.setAdapter(arrayAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            nextActivity(i);

        }
    });

    listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {

            final int item = i;

            new AlertDialog.Builder(MainActivity.this)
                    .setIcon(android.R.drawable.alert_dark_frame)
                    .setTitle("Ar norite istrinti?")
                    .setMessage("Irasas bus pasalintas")
                    .setPositiveButton("Taip", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {

                            vaistai.remove(item);
                            numbers.remove(item);
                            description.remove(item);
                            arrayAdapter.notifyDataSetChanged();

                            SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("com.example.adam.vaistai", Context.MODE_PRIVATE);

                            HashSet<String> numberSet = new HashSet<String>(MainActivity.numbers);

                            sharedPreferences.edit().putStringSet("numbers", numberSet).apply();

                            HashSet<String> set = new HashSet<String>(MainActivity.vaistai);

                            sharedPreferences.edit().putStringSet("names", set).apply();

                            HashSet<String> descSet = new HashSet<String>(MainActivity.description);

                            sharedPreferences.edit().putStringSet("desc", descSet).apply();
                        }
                    }
                    )
                    .setNegativeButton("Ne", null)
                    .show();

            return true;
        }
    });

}

}

Adomas
  • 21
  • 1
  • 8

1 Answers1

0

As set is a collection try using the below line for adding set to a list. The addall method expects collection.

vaistai.addAll(set);

and also make sure that these lines

HashSet<String> set = (HashSet<String>) sharedPreferences.getStringSet("names", null);

HashSet<String> numberSet = (HashSet<String>) sharedPreferences.getStringSet("numbers", null);

HashSet<String> descSet = (HashSet<String>) sharedPreferences.getStringSet("desc", null);

are returning null in case of empty string set, do this by setting breakpoints and debugging.