해당 카테고리에는 전공 과목 모바일 소프트웨어를 들으며 기록하고 싶은 내용을 기록하겠습니다. 앱을 처음 배워보는 학기이며 아직 무지하기에 지적과 피드백은 언제나 환영입니다.
구현
ListView의 항목인 원본 데이터를 담고 있고 처리하는 별도의 클래스를 하나 만들고
MainActivity에서 다음과 같은 처리를 한다.
1. 항목 클릭 시 해당 항목을 EditText에 표시
2. EditText에 문자열 입력 후 [추가] 버튼을 눌러 항목 추가
3. 롱클릭 시 해당 항목 삭제
4. 항목 클릭 시 EditText에 해당 항목 표시, 항목 수정 후 [수정] 버튼을 누를 경우 리스트 뷰 항목 변경
추가
추가 버튼 눌렀을 때 처리한다. onClick 메소드 안에서 추가 버튼 아이디 case 부분에서 처리한다.
1) String 변수로 EditText에 입력되어 있는 값 가져오고
2) 별도 클래스로 생성한 객체를 이용해 별도 클래스 속 데이터 추가 메소드를 호출한다. (매개변수로 위에서 받은 String 값을 넣어서)
3) 원본 데이터를 사용하는 adapter에게 원본 데이터 변경 알림을 준다. (데이터 갱신 위해)
삭제
항목 롱클릭 시 해당 항목 삭제한다.
1) AdapterView.OnItemLongClickListener 객체를 생성하고
2) 그 안에서 onItemLongClick 메소드를 재정의한다. 이 메소드 안에서 별도 클래스로 생성한 객체를 이용해 별도 클래스 속 데이터 삭제 메소드를 호출한다. (매개변수로 받은 위치 값 i를 넣어서)
3) 원본 데이터를 사용하는 adapter에게 원본 데이터 변경 알림을 준다. (데이터 갱신 위해)
수정
항목 클릭 시 EditText에 내용을 띄우고, 값 수정 후 수정 버튼을 눌렀을 때 처리한다. 클릭한 항목의 위치와 수정된 값을 알아야 한다.
1) AdapterView.OnItemClickListener 객체를 생성하고
2) 그 안에서 onItemClick 메소드를 재정의한다. 이 메소드 안에서 전역 변수로 설정한 int형 변수 pos를 이용해 매개변수로 들어오는 i값을 넣어준다.
3) 그리고 onClick 메소드 안에서 수정 버튼 아이디 case 부분에서 처리한다.
4) String 변수로 EditText에 입력되어 있는 값 가져오고
5) 별도 클래스로 생성한 객체를 이용해 별도 클래스 속 데이터 수정 메소드를 호출한다. (매개변수로 위에서 받은 String 값과 pos를 넣어서)
6) 원본 데이터를 사용하는 adapter에게 원본 데이터 변경 알림을 준다. (데이터 갱신 위해)
좀 더 신경 썼던 부분들만 적어보면 다음과 같다.
- xml design 탭에서 버튼 2개에는 onClick 속성 값으로 onClick 메소드를 설정한다. MainActivity에는 onClick 메소드를 생성하고 버튼 클릭 시 수행할 동작을 작성한다.
- OnItemClickListener와 OnItemLongClickListener 추가하고 각각 클릭 시 수행할 동작을 작성한다.
- 수정하는 부분은 항목을 선택하는 순간 EditText에 나오게 하고, 수정 버튼을 누르는 순간 (EditText 내용 + 그 항목이 몇 번째 항목이었는지 위치)를 별도 클래스로 만든 객체 속 수정 메소드를 호출한다. 그리고 원본 데이터 갱신을 위해 Adapter에게 변경 알림을 해준다.
코드
MainActivity.java
package ddwu.mobile.week09.lab02;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
SubjectManager subjectManager;
ArrayList<String> subjectList;
ArrayAdapter<String> adapter;
ListView listView;
EditText editText;
int pos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
subjectManager = new SubjectManager();
subjectList = subjectManager.getSubjectList();
adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_1, subjectList
);
listView = findViewById(R.id.listView);
listView.setAdapter(adapter);
editText = findViewById(R.id.editText);
listView.setOnItemClickListener(itemClickListener);
listView.setOnItemLongClickListener(itemLongClickListener);
}
AdapterView.OnItemClickListener itemClickListener =
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View v, int i, long l) {
//항목 클릭 시 해당 항목을 editText에 표시
editText.setText(adapter.getItem(i));
//수정을 위한 pos. 클릭 시 항목 위치 저장해 놓는다.
pos = i;
}
};
AdapterView.OnItemLongClickListener itemLongClickListener =
new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
subjectManager.removeData(i);
adapter.notifyDataSetChanged();
return false;
}
};
public void onClick (View v) {
switch (v.getId()) {
//EditText에 문자열 입력 후 추가 버튼을 눌러 항목 추가
case R.id.btn_add:
String str1 = editText.getText().toString();
subjectManager.addData(str1);
adapter.notifyDataSetChanged();
break;
case R.id.btn_modify:
String str2 = editText.getText().toString();
subjectManager.modifyData(pos,str2);
adapter.notifyDataSetChanged();
break;
}
}
}
SubjectManager.java
package ddwu.mobile.week09.lab02;
import java.util.ArrayList;
public class SubjectManager {
private ArrayList<String> subjectList;
public SubjectManager() {
subjectList = new ArrayList();
subjectList.add("FEEL ME");
subjectList.add("DEJA VU");
subjectList.add("DRIVERS LICENSE");
subjectList.add("GOOD 4 U");
subjectList.add("LOSE YOU TO LOVE ME");
}
public ArrayList<String> getSubjectList() {
return subjectList;
}
// 추가
public void addData(String newSubject) {
subjectList.add(newSubject);
}
// 삭제
public void removeData(int idx) {
subjectList.remove(idx);
}
// 수정
public void modifyData(int idx, String newSubject) {
subjectList.set(idx, newSubject); //set함수 사용
}
}
코드 볼 때 좀 더 가독성 있게 읽으려면 메소드 블록 혹은 처리를 위한 블록 별로 보면 된다. 코드 쓸 때도 그렇게 생각하고 쓰는 것처럼 나중에 코드 다 쓰고 나서도 한 눈에 들어오게 읽으려면 블록 별로 나눠서 읽는 게 좋다.
구현하고 싶은 부분에 어떤 처리가 필요한지 객체나 메소드 기억하자.