0

So this is part of my reminder app, when i save an alarm and it saves as a row, i want to be able to edit the alarm when clicking on that row but how can i save the state of the activity and reload it when i click on the row itself?

public class MainActivity extends AppCompatActivity {

private Button setReminder;
private ListView listview;

private DatabaseActivity dba;
private ArrayList<MyAlarm> dbalarms= new ArrayList<>();
private AlarmAdapter alarmAdapter;



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


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




    setReminder = (Button) findViewById(R.id.button);

    final ArrayList<HashMap<String, String>> list = new ArrayList<>();


    setReminder.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {



                startActivity(new Intent(MainActivity.this, AlarmChooser.class));


        }


    });




}

private void refreshData() {
    dbalarms.clear();
    dba = new DatabaseActivity(getApplicationContext());
    ArrayList<MyAlarm> alarmsFromDB = dba.getAlarms();
    for(int temp=0;temp<alarmsFromDB.size();temp++){

        String title = alarmsFromDB.get(temp).getTitle();
        String content= alarmsFromDB.get(temp).getContent();
        String dateText= alarmsFromDB.get(temp).getRecordDate();
        String timeText= alarmsFromDB.get(temp).getRecordTime();

        MyAlarm myAlarm= new MyAlarm();
        myAlarm.setTitle(title);
        myAlarm.setContent(content);
        myAlarm.setRecordTime(timeText);
        myAlarm.setRecordDate(dateText);

        dbalarms.add(myAlarm);
    }
    dba.close();
    alarmAdapter = new AlarmAdapter(MainActivity.this, R.layout.remrow, dbalarms);


        listview.setAdapter(alarmAdapter);

        alarmAdapter.notifyDataSetChanged();

}

public class AlarmAdapter extends ArrayAdapter<MyAlarm>{

    Activity activity;
    int layoutResource;
    MyAlarm alarm;
    ArrayList<MyAlarm> mData = new ArrayList<>();

    public AlarmAdapter(Activity act, int resource, ArrayList<MyAlarm> data) {
        super(act, resource, data);
        activity = act;
        layoutResource = resource;
        mData = data;
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public MyAlarm getItem(int position) {
        return mData.get(position);
    }

    @Override
    public int getPosition(MyAlarm item) {
        return super.getPosition(item);
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row = convertView;
        ViewHolder holder = null;
        if(row==null || row.getTag()==null){
            LayoutInflater inflater = LayoutInflater.from(activity);
            row = inflater.inflate(layoutResource,null);
            holder=new ViewHolder();

            holder.mTitle=(TextView)row.findViewById(R.id.name);
            holder.mDate=(TextView)row.findViewById(R.id.dateText);
            holder.mTime=(TextView)row.findViewById(R.id.timeText);

            row.setTag(holder);
        }else{
            holder = (ViewHolder)row.getTag();
        }



        holder.myAlarm = getItem(position);
        holder.mTitle.setText(holder.myAlarm.getTitle());
        holder.mDate.setText(holder.myAlarm.getRecordDate());
        holder.mTime.setText(holder.myAlarm.getRecordTime());


        final ViewHolder finalHolder = holder;
        holder.mTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String title= finalHolder.myAlarm.getTitle().toString();
                String dateText=finalHolder.myAlarm.getRecordDate().toString();
                String timeText=finalHolder.myAlarm.getRecordTime().toString();




            }
        });

        return row;


    }

    class ViewHolder{

        MyAlarm myAlarm;
        TextView mTitle;
        TextView mDate;
        TextView mTime;
        TextView mContent;
        TextView mID;
    }
}

} and this is one of my reminders called TimeDateRem which as it implies is a reminder at a specific time and date

public class TimeDateRem extends AppCompatActivity {

DatePicker pickerDate;
TimePicker pickerTime;
Button buttonSetAlarm, cancelButton, deleteButton;
TextView info, title;
PendingIntent pendingIntent;
AlarmManager alarmManager;
 private DatabaseActivity dba;

final static int RQS_1 = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.reminder_view);
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        onRestoreInstanceState(savedInstanceState);
    } else {

        dba = new DatabaseActivity(getApplicationContext());

        info = (TextView) findViewById(R.id.info);
        title = (EditText) findViewById(R.id.title);
        pickerDate = (DatePicker) findViewById(R.id.pickerdate);
        pickerTime = (TimePicker) findViewById(R.id.pickertime);

        Calendar now = Calendar.getInstance();

        pickerDate.init(
                now.get(Calendar.YEAR),
                now.get(Calendar.MONTH),
                now.get(Calendar.DAY_OF_MONTH),
                null);

        pickerTime.setCurrentHour(now.get(Calendar.HOUR_OF_DAY));
        pickerTime.setCurrentMinute(now.get(Calendar.MINUTE));

        cancelButton = (Button) findViewById(R.id.cancel);
        cancelButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cancelAlarm(pendingIntent);
                startActivity(new Intent(TimeDateRem.this, MainActivity.class));

            }
        });

        deleteButton = (Button) findViewById(R.id.deletealarm);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

        buttonSetAlarm = (Button) findViewById(R.id.setalarm);
        buttonSetAlarm.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {

                Calendar current = Calendar.getInstance();

                Calendar cal = Calendar.getInstance();
                cal.set(pickerDate.getYear(),
                        pickerDate.getMonth(),
                        pickerDate.getDayOfMonth(),
                        pickerTime.getCurrentHour(),
                        pickerTime.getCurrentMinute(),
                        0);

                if (!title.getText().toString().equals("")) {

                    if (cal.compareTo(current) <= 0) {


                        Toast.makeText(getApplicationContext(), "Invalid Date/Time", Toast.LENGTH_LONG).show();
                    } else {


                        setAlarm(cal);
                        saveToDB();
                    }
                } else {
                    Toast.makeText(TimeDateRem.this, "Reminder Name Should Not Be Empty", Toast.LENGTH_SHORT).show();
                }

            }
        });
    }
}
private void setAlarm(Calendar targetCal){
    SharedPreferences sharedPreferences=getSharedPreferences("MySavedData",Context.MODE_PRIVATE);
    SharedPreferences.Editor editor =sharedPreferences.edit();
    editor.putString("title", title.getText().toString());
    editor.putString("content", info.getText().toString());
    editor.putInt("dateMonth",pickerDate.getMonth());
    editor.putInt("dateYear",pickerDate.getYear());
    editor.putInt("date",pickerDate.getDayOfMonth());


    info.setText("\n\n***\n"
            + "Alarm is set @ " + targetCal.getTime() + "\n"
            + "***\n");

    Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
    pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
    alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
}
private void cancelAlarm(PendingIntent p){
    if ( alarmManager!= null) {
        alarmManager.cancel(p);
    }
}
public void saveToDB(){

  MyAlarm alarm= new MyAlarm();
    alarm.setTitle(title.getText().toString().trim());
    alarm.setRecordDate(pickerDate.getDayOfMonth()+"/"+pickerDate.getMonth()+"/"+pickerDate.getYear());
    alarm.setRecordTime(pickerTime.getCurrentHour()+"/"+pickerTime.getCurrentMinute());

    dba.addAlarms(alarm);
    dba.close();

    info.setText("");

    Intent i = new Intent(TimeDateRem.this, MainActivity.class);
    startActivity(i);
  }

public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    // Save UI state changes to the savedInstanceState.
    // This bundle will be passed to onCreate if the process is
    // killed and restarted.
    savedInstanceState.putString("title", title.getText().toString());
    savedInstanceState.putString("content", info.getText().toString());
    savedInstanceState.putInt("dateMonth",pickerDate.getMonth());
    savedInstanceState.putInt("dateYear",pickerDate.getYear());
    savedInstanceState.putInt("dateDay",pickerDate.getDayOfMonth());
    savedInstanceState.putInt("timeMinute",pickerTime.getCurrentMinute());
    savedInstanceState.putInt("timeHour",pickerTime.getCurrentHour());

}

@Override
protected void onPause() {
    super.onPause();
  /*  super.onSaveInstanceState(savedInstanceState);

    savedInstanceState.putString("title", title.getText().toString());
    savedInstanceState.putString("content", info.getText().toString());
    savedInstanceState.putInt("dateMonth",pickerDate.getMonth());
    savedInstanceState.putInt("dateYear",pickerDate.getYear());
    savedInstanceState.putInt("dateDay",pickerDate.getDayOfMonth());
    savedInstanceState.putInt("timeMinute",pickerTime.getCurrentMinute());
    savedInstanceState.putInt("timeHour",pickerTime.getCurrentHour());*/
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    // Restore UI state from the savedInstanceState.
    // This bundle has also been passed to onCreate.
    title.setText(savedInstanceState.getString("title"));
    info.setText( savedInstanceState.getString("content"));

    int myMonth = savedInstanceState.getInt("dateMonth");
    int myYear = savedInstanceState.getInt("dateYear");
    int myDay = savedInstanceState.getInt("dateDay");
    int myMinute = savedInstanceState.getInt("timeMinute");
    int myHour = savedInstanceState.getInt("timeHour");


    pickerDate.init(myYear,myMonth,myDay,null);
    pickerTime.setCurrentHour(myHour);
    pickerTime.setCurrentMinute(myMinute);



}

}

Sorry for the lot of code but can anyone help ?

EDIT: DATABASE CLASS ADDED

public class DatabaseActivity extends SQLiteOpenHelper {

private final ArrayList<MyAlarm> alarmList = new ArrayList<>();

public DatabaseActivity(Context context) {

    super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION);

}

@Override
public void onCreate(SQLiteDatabase db) {

    String CREATE_WISHES_DATABASE = "CREATE TABLE " + Constants.TABLE_NAME +
            " ( " + Constants.KEY_ID + " INTEGER PRIMARY KEY, " + Constants.COLUMN_NAME +
            " TEXT, " + Constants.COLUMN_DESCRIPTION + " TEXT, " + Constants.COLUMN_DATE +
            " LONG, " + Constants.COLUMN_TIME + " LONG); ";

    db.execSQL(CREATE_WISHES_DATABASE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    db.execSQL("DROP TABLE IF EXIST " + Constants.TABLE_NAME);

    onCreate(db);
}


 public void addAlarms(MyAlarm alarm) {

     SQLiteDatabase db=this.getWritableDatabase();

     ContentValues values= new ContentValues();
     values.put(Constants.COLUMN_NAME , alarm.getTitle());
     values.put(Constants.COLUMN_DESCRIPTION , alarm.getContent());
     values.put(Constants.COLUMN_DATE , System.currentTimeMillis());
     values.put(Constants.COLUMN_TIME , alarm.getRecordTime());

     db.insert(Constants.TABLE_NAME, null, values);
     db.close();
}

public ArrayList<MyAlarm> getAlarms(){

    String selectQuery= "SELECT * FROM " + Constants.TABLE_NAME;
    SQLiteDatabase db = this.getReadableDatabase();

    Cursor cursor = db.query(Constants.TABLE_NAME, new String[]{Constants.KEY_ID, Constants.COLUMN_NAME
    ,Constants.COLUMN_DESCRIPTION,Constants.COLUMN_DATE,Constants.COLUMN_TIME},null,null,null,null,Constants.COLUMN_DATE
    + " DESC");

    if(cursor.moveToFirst()){
        do{

            MyAlarm alarm = new MyAlarm();
            alarm.setTitle(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_NAME)));
            alarm.setContent(cursor.getString(cursor.getColumnIndex(Constants.COLUMN_DESCRIPTION)));

            java.text.DateFormat dateFormat=java.text.DateFormat.getDateInstance();
            String dateData= dateFormat.format(new Date(cursor.getLong(cursor.getColumnIndex(Constants.COLUMN_DATE))).getTime());

            alarm.setRecordDate(dateData);

            alarmList.add(alarm);
        }while(cursor.moveToNext());
    }

    return alarmList;
}

}

EDIT : i was trying to make it easier for reader by not showing the class between my main activity and my timedaterem but that was only causing confusion so i added my alarm chooser class

public class AlarmChooser extends Activity {

private ListView listview;


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

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int Width = dm.widthPixels;
    int height = dm.heightPixels;

    getWindow().setLayout( (Width), (int) (height * .55));
    listview = (ListView) findViewById( R.id.smallList );
    final String[] alarms= new String[]{"Time and Date Reminder","Birthday Reminder",
            "HolidayReminder(Lebanon)","HolidayReminder(SaudiArabia)","HolidayReminder(Kuwait)","HolidayReminder(UAE)", "Timer"};

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),
            android.R.layout.simple_list_item_1,android.R.id.text1,alarms);

    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            int intposition = i;
            String clickedValue=listview.getItemAtPosition(intposition).toString();
            Toast.makeText(AlarmChooser.this, clickedValue, Toast.LENGTH_SHORT).show();



            if(alarms[0].equals(clickedValue)){
                startActivity(new Intent(getApplicationContext(), TimeDateRem.class));
            }else if(alarms[1].equals(clickedValue)){
                startActivity(new Intent(getApplicationContext(),BirthdayRem.class));
            }else if(alarms[2].equals(clickedValue)){
                startActivity(new Intent(getApplicationContext(),HolidayReminderLebanon.class));
            }else if(alarms[3].equals(clickedValue) ){
                startActivity(new Intent(getApplicationContext(), HolidayReminderSaudiArabia.class));
            }else if(alarms[4].equals(clickedValue)) {
                startActivity(new Intent(getApplicationContext(), HolidayReminderKuwait.class));
            }else if(alarms[5].equals(clickedValue)) {
                startActivity(new Intent(getApplicationContext(), HolidayReminderUAE.class));
            }else if(alarms[6].equals(clickedValue)) {
                startActivity(new Intent(getApplicationContext(), Timer.class));
            }

        }
    });
}

}

2 Answers2

1

use finish() instead of starting the Activity again. And the previous activity will keep it's own state.

public void saveToDB(){

MyAlarm alarm= new MyAlarm();
alarm.setTitle(title.getText().toString().trim());
alarm.setRecordDate(pickerDate.getDayOfMonth()+"/"+pickerDate.getMonth()+"/"+pickerDate.getYear());
alarm.setRecordTime(pickerTime.getCurrentHour()+"/"+pickerTime.getCurrentMinute());

dba.addAlarms(alarm);
dba.close();

info.setText("");

finish();

}

zMabrook
  • 913
  • 7
  • 9
0

how can i save the state of the activity

You seem to already know how to use onSaveInstanceState

You shouldn't need that for the listview, though, it's simply loading a database

Also, not sure it matters here, but you'll want to finish the Activity here, for example

   cancelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            cancelAlarm(pendingIntent);
            finish();  // not start a new Activity 
        }
    });

i want to be able to edit the alarm when clicking on that row

It'll be really difficult to know what to alarm you're editing simply from an ArrayAdapter of string. You'll want to set your click listed on a ListView that uses your AlarmAdapter class, then you can do something like this

// inside onItemClick
MyAlarm alarm = (MyAlarm) adapterView.getItemAtPosition(position);

Class next = null;
if(alarms[0].equals(clickedValue)){
    next = TimeDateRem.class;
}else if(alarms[1].equals(clickedValue)) {
    next = BirthdayRem.class;
}

if (next!=null) {
    next.putExtra("alarm_id", alarm.getId()); // for example 
    startActivity(AlarmChooser.this , next);
} 

How do I pass data between Activities in Android application?

reload it when i click on the row itself

As soon as you update the database, your Activity data will be created with those edits

Community
  • 1
  • 1
OneCricketeer
  • 126,858
  • 14
  • 92
  • 185
  • what do i say in the OnItemClickListener, thats my main problem, TimeDateRem is not my only activity, i have many type of reminders, so lets say i have schedueled 5 alarms of different type, if i type a random one of them how does it know which saved state to reload? @cricket_007 – Johnny Khoueiry Apr 12 '17 at 12:13
  • I'm not sure why you have 5 types when your list only stores one MyAlarm class, but your database holds an ID field, yes? Are you not storing that as part of the Alarm clsss? If you are, it's simple to update only that alarm in the database – OneCricketeer Apr 12 '17 at 12:16
  • they are different type of alarms, like one is timeanddate another is a holiday reminder another is a timer reminder ...that sort of stuff, but yes my database does hold an id field but what do u mean to store it as part of a class? – Johnny Khoueiry Apr 12 '17 at 12:24
  • Simply an integer... `alarm.getId()`? – OneCricketeer Apr 12 '17 at 12:25
  • just added my database class – Johnny Khoueiry Apr 12 '17 at 12:26
  • Okay, for example `alarm.setId(cursor.getInt(0))`... You'll want to store that (or any unique identifier) if you ever want to know which alarm you are editing – OneCricketeer Apr 12 '17 at 12:30
  • but where would i call that, i mean would that set an integer for every alarm row i create ? sorry for bugging you i'v just been stuck on this for a week @cricket_007 – Johnny Khoueiry Apr 12 '17 at 12:34
  • Don't you want an ID? I mean, it's already in the database, right? Why not get it out? Yes, every alarm has a *unique value* and that's the whole point. What do you mean where to put it? Look at your database code... `alarm.setTitle`...? You get all the other fields from the cursor, why not the ID? – OneCricketeer Apr 12 '17 at 12:43
  • ohh i misunderstood what u said, mmm....i mean i did add alarm.setId(cursor.getInt(cursor.getColumnIndex(Constants.KEY_ID))); before but i ddnt really know how to have it increment for every new row so i ddnt really implement it in my code(wasent sure how to add autoincrement to it in sqlite) @cricket_007 – Johnny Khoueiry Apr 12 '17 at 12:52
  • 1
    wooow...so all i had to do was add AUTOINCREMENT keyword for ID...ty very much for that uv been very helpfull... but still dont know what to do in the onItemClickListener as in when i click the row itself and thanks again for bearing with me @cricket_007 – Johnny Khoueiry Apr 12 '17 at 13:08
  • i edited the post so that everything is a bit clearer @cricket_007 ... alarmchooser is basically when the user wants to choose the alarm – Johnny Khoueiry Apr 12 '17 at 14:09