저장된 Task를 수정하는 기능을 구현하였다.
먼저 MainActivity 에서 구현한 onItemSwipeListener 인터페이스의 editItem 메소드를 구현하였다.
이곳에 Task를 수정하는 액티비티로 이동하는 코드를 작성하였다.
public class MainActivity extends AppCompatActivity implements onItemSwipeListener {
...
private ActivityResultLauncher<Intent> editResultLauncher;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
// EditActivity ActivityResultCallback
editResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult o) {
if(o.getResultCode() == RESULT_OK){
Intent intent = o.getData();
String task = intent.getStringExtra("task");
String date = intent.getStringExtra("date");
String address = intent.getStringExtra("address");
int id = intent.getIntExtra("id", -1);
//Edit Database
TaskDatabase database = TaskDatabase.getInstance(getApplicationContext());
String SQL = "UPDATE " + database.TABLE_USERS + " SET " +
"TASK = '" + task + "', " +
"date = '" + date + "', " +
"ADDRESS = '" + address + "' " +
"WHERE _id = " + id;
if(database != null){
database.execSQL(SQL);
loadTaskListData();
}
}
}
});
...
}
...
// implements onItemSwipeListener editItem
@Override
public void editItem(int position) {
Task task = adapter.getItem(position);
Intent intent = new Intent(getApplicationContext(), EditActivity.class);
intent.putExtra("id", task.getId());
intent.putExtra("task", task.getTask());
intent.putExtra("date", task.getDate());
intent.putExtra("address", task.getAddress());
editResultLauncher.launch(intent);
}
ActivityResultLauncher를 사용해 만든 editResultLauncher를 사용해 리사이클러뷰의 item을 슬라이드하면 문제 수정 액티비티(EditActivity)으로 이동하도록 만들었다.
이 때 item에 저장된 Task 정보를 Intent를 이용해 문제 수정 액티비티로 전달하도록 하였다.
// implements onItemSwipeListener editItem
@Override
public void editItem(int position) {
Task task = adapter.getItem(position);
Intent intent = new Intent(getApplicationContext(), EditActivity.class);
intent.putExtra("id", task.getId());
intent.putExtra("task", task.getTask());
intent.putExtra("date", task.getDate());
intent.putExtra("address", task.getAddress());
editResultLauncher.launch(intent);
}
수정 액티비티에서 Intent를 통해 응답을 받으면 Intent로 온 데이터를 이용해 데이터베이스를 수정한 후 리사이클러뷰를 갱신하도록 만들었다.
// EditActivity ActivityResultCallback
editResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult o) {
if(o.getResultCode() == RESULT_OK){
Intent intent = o.getData();
String task = intent.getStringExtra("task");
String date = intent.getStringExtra("date");
String address = intent.getStringExtra("address");
int id = intent.getIntExtra("id", -1);
//Edit Database
TaskDatabase database = TaskDatabase.getInstance(getApplicationContext());
String SQL = "UPDATE " + database.TABLE_USERS + " SET " +
"TASK = '" + task + "', " +
"date = '" + date + "', " +
"ADDRESS = '" + address + "' " +
"WHERE _id = " + id;
if(database != null){
database.execSQL(SQL);
loadTaskListData();
}
}
}
});
문제를 수정하는 액티비티인 EditActivity를 만들었다.
레이아웃은 AddActivity와 같고, View의 text 정도만 수정하였다.

EditActivity의 코드는 다음과 같다.
public class EditActivity extends AppCompatActivity {
EditText editTextTask;
EditText editTextAdd;
Button buttonSetTime;
Button buttonEdit;
TextView textYear;
TextView textDate;
String taskString;
String yearString;
String dateString;
String addString;
int id;
DatePickerDialog datePickerDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
// Views
editTextTask = findViewById(R.id.editTextTask_edit);
editTextAdd = findViewById(R.id.editTextAdd_edit);
buttonSetTime = findViewById(R.id.buttonSetTime_edit);
buttonEdit = findViewById(R.id.buttonEdit);
textYear = findViewById(R.id.textYear_edit);
textDate = findViewById(R.id.textDate_edit);
// get data from MainActivity
Intent intent = getIntent();
if(intent != null){
String task = intent.getStringExtra("task");
String date = intent.getStringExtra("date");
String address = intent.getStringExtra("address");
id = intent.getIntExtra("id", -1);
taskString = task;
editTextTask.setText(taskString);
String[] dates = date.split(" ");
yearString = dates[0];
textYear.setText(yearString);
dateString = dates[1];
textDate.setText(dateString);
addString = address;
editTextAdd.setText(addString);
}
// init DatePicker
initDatePicker();
buttonSetTime.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
datePickerDialog.show();
}
});
buttonEdit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
taskString = editTextTask.getText().toString();
dateString = yearString + " " + dateString;
addString = editTextAdd.getText().toString();
if(taskString == null || taskString.equals("")){
Toast.makeText(getApplicationContext(), "할 일을 입력해 주세요.", Toast.LENGTH_SHORT).show();
}else if(yearString == null || yearString.equals("")){
Toast.makeText(getApplicationContext(), "날짜를 입력해 주세요.", Toast.LENGTH_SHORT).show();
}else if(addString == null || addString.equals("")){
Toast.makeText(getApplicationContext(), "주소를 입력해 주세요.", Toast.LENGTH_SHORT).show();
}else{
Intent intent = new Intent();
intent.putExtra("task", taskString);
intent.putExtra("date", dateString);
intent.putExtra("address", addString);
intent.putExtra("id", id);
setResult(RESULT_OK, intent);
finish();
}
}
});
}
// init DatePicker
private void initDatePicker() {
DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
yearString = Integer.toString(year);
dateString = month + "/" + day;
textYear.setText(yearString);
textDate.setText(dateString);
}
};
Calendar calendar = Calendar.getInstance();
int year;
int month;
int day;
int style = AlertDialog.THEME_HOLO_LIGHT;
if(yearString == null || yearString.equals("")){
year = calendar.get(Calendar.YEAR);
}else{
year = Integer.parseInt(yearString);
}
if(dateString == null || dateString.equals("")){
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
}else{
String[] dates = dateString.split("/");
month = Integer.parseInt(dates[0]) - 1;
day = Integer.parseInt(dates[1]);
}
datePickerDialog = new DatePickerDialog(this, style, dateSetListener, year, month, day);
}
}
기능 자체는 AddActivity와 거의 같다.
차이점은 MainActivity에서 받아온 Task 데이터를 뷰에 바로 보여지도록 만들었고
// get data from ListActivity
Intent intent = getIntent();
if(intent != null){
String task = intent.getStringExtra("task");
String date = intent.getStringExtra("date");
String address = intent.getStringExtra("address");
id = intent.getIntExtra("id", -1);
taskString = task;
editTextTask.setText(taskString);
String[] dates = date.split(" ");
yearString = dates[0];
textYear.setText(yearString);
dateString = dates[1];
textDate.setText(dateString);
addString = address;
editTextAdd.setText(addString);
}
DatePicker로 기본적으로 선택된 날짜도 받아온 데이터가 되도록 만들었다.
// init DatePicker
private void initDatePicker() {
DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
yearString = Integer.toString(year);
dateString = month + "/" + day;
textYear.setText(yearString);
textDate.setText(dateString);
}
};
Calendar calendar = Calendar.getInstance();
int year;
int month;
int day;
int style = AlertDialog.THEME_HOLO_LIGHT;
if(yearString == null || yearString.equals("")){
year = calendar.get(Calendar.YEAR);
}else{
year = Integer.parseInt(yearString);
}
if(dateString == null || dateString.equals("")){
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
}else{
String[] dates = dateString.split("/");
month = Integer.parseInt(dates[0]) - 1;
day = Integer.parseInt(dates[1]);
}
datePickerDialog = new DatePickerDialog(this, style, dateSetListener, year, month, day);
}


