이번 시간에는 저번 포스팅에 이어서 하겠습니다.
저번에 만든 DB와 화면에 조회와 등록하는 기능을
추가해 보겠습니다.
2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB
- 설명 -
조회 쿼리의 db변수에는 getReadableDatabase로 변경
//할일 전체 가져오기
public ArrayList<ToDoModel> getAllTasks(){
ArrayList<ToDoModel> taskList = new ArrayList<>();
Cursor cursor = null;
String query = "SELECT * FROM " + TABLE_NAME;
db = this.getReadableDatabase();
if(db != null){
cursor = db.rawQuery(query, null);
while(cursor.moveToNext()){
ToDoModel task = new ToDoModel();
task.setId(cursor.getInt(0));
task.setTask(cursor.getString(1));
task.setStatus(cursor.getInt(2));
taskList.add(task);
}
}
return taskList;
}
- 설명 -
toBoolean: 체크상태를 boolean값으로 돌려준다.
setTasks: 리스트에 데이터 담기
removeItem: 할일 삭제
getItemCount: 할일 갯수 돌려준다.
public class ToDoAdapter extends RecyclerView.Adapter<ToDoAdapter.ViewHolder>{
private ArrayList<ToDoModel> todoList = new ArrayList<>();
private ToDoDB db;
public ToDoAdapter(ToDoDB db) {
this.db = db;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.task_list, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
ToDoModel item = todoList.get(position);
holder.mCheckBox.setText(item.getTask());
holder.mCheckBox.setChecked(toBoolean(item.getStatus()));
//체크박스 체크 이벤트
holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
//체크상태면 1 아니면 0
if(isChecked){
db.updateStatus(item.getId(), 1);
}else{
db.updateStatus(item.getId(), 0);
}
}
});
}
/**
* 체크상태 boolean으로 변경
* @param n 상태값
* @return
*/
private boolean toBoolean(int n){
return n != 0;
}
/**
* 리스트에 데이터 담기
* @param todoList 할일 리스트
*/
public void setTasks(ArrayList<ToDoModel> todoList){
this.todoList = todoList;
notifyDataSetChanged();
}
/**
* 할일 삭제
* @param position 할일 위치
*/
public void removeItem(int position){
todoList.remove(position);
notifyItemRemoved(position);
}
/**
* 할일 갯수
* @return 갯수
*/
@Override
public int getItemCount() {
return todoList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder{
CheckBox mCheckBox;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mCheckBox = itemView.findViewById(R.id.m_check_box);
}
}
}
- 설명 -
1. FloatingActionButton을 누르면 입력 모드가 됩니다.
2. 할 일을 적고 (ADD, UPDATE) 버튼을 누르면 FAB모드가 됩니다.
3. viewMode: 입력일때와 FAB일 때의 화면 전환 기능
4. hideKeyboard: 저장을 하고나면 자동으로 키보드가 사라집니다.
5. selectReset: 저장(추가,수정)후에 버튼명 변경 및 조회 기능
6. selectData: 조회 기능
public class MainActivity extends AppCompatActivity {
//선언
ArrayList<ToDoModel> taskList;
ToDoAdapter adapter;
RecyclerView recyclerView;
FloatingActionButton fab;
EditText todoText;
Button addBtn;
//DB
ToDoDB db;
//입력 레이아웃
LinearLayout bottomLayout;
//할일 ID
int gId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//DB 연결
db = new ToDoDB(this);
///초기화
taskList = new ArrayList<>();
bottomLayout = findViewById(R.id.bottom_section);
todoText = findViewById(R.id.todo_text);
addBtn = findViewById(R.id.add_btn);
fab = findViewById(R.id.fab);
//recyclerView 설정
recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//adapter 설정
adapter = new ToDoAdapter(db);
adapter.setTasks(taskList);
//adapter 적용
recyclerView.setAdapter(adapter);
//조회
selectData();
//등록모드
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewMode("ADD");
}
});
//추가 버튼
addBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewMode("FAB");
String text = todoText.getText().toString();
//ADD면 등록 아니면 수정
if(addBtn.getText().toString().equals("ADD")){
//데이터 담기
ToDoModel task = new ToDoModel();
task.setTask(text);
task.setStatus(0);
//할일 추가
db.addTask(task);
//조회 및 리셋
selectReset("ADD");
}else{ //수정
//할일 수정
db.updateTask(gId, text);
//조회 및 리셋
selectReset("UPDATE");
}
//키보드 내리기
hideKeyboard(todoText);
}
});
//할일 입력 체크
todoText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if(charSequence.toString().equals("")){
addBtn.setEnabled(false);
addBtn.setTextColor(Color.GRAY);
}else{
addBtn.setEnabled(true);
addBtn.setTextColor(Color.BLACK);
}
}
@Override
public void afterTextChanged(Editable editable) { }
});
}//onCreate
/**
* 조회
*/
public void selectData() {
taskList = db.getAllTasks();
Collections.reverse(taskList);
adapter.setTasks(taskList);
adapter.notifyDataSetChanged();
}
/**
* 조회및 리셋
* @param type
*/
public void selectReset(String type){
//조회
selectData();
//초기화
todoText.setText("");
//등록이 아니면 등록으로 변경
if(!type.equals("ADD")){
addBtn.setText("ADD");
}
}
/**
* 화면상태
* @param type 상태타입
*/
public void viewMode(String type){
//입력하고 나면 입력창 사라지고 FAB 보여줌
if(type.equals("FAB")){
//입력창 숨김
bottomLayout.setVisibility(View.GONE);
//fab 보여줌
fab.setVisibility(View.VISIBLE);
}else{//FAB누르면 입력창 보여주고 FAB 사라짐
//입력창 보여줌
bottomLayout.setVisibility(View.VISIBLE);
//fab 숨김
fab.setVisibility(View.INVISIBLE);
}
}
/**
* 키보드 숨기는 이벤트
* @param editText 입력뷰
*/
private void hideKeyboard(EditText editText) {
InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//키보드 숨김
manager.hideSoftInputFromWindow(editText.getApplicationWindowToken(), 0);
}
}//MainActivity
2022.03.16 - [안드로이드] - [안드로이드] Firebase Storage 이미지 업로드 part1
2022.03.17 - [안드로이드] - [안드로이드] Firebase Storage 이미지 리스트 part2
[안드로이드] tic-tac-toe 보드게임 만드는 방법 part1 - 화면구성 (0) | 2022.03.23 |
---|---|
[안드로이드] ToDoList SQLite 만드는 방법 part3 - 수정, 삭제 (0) | 2022.03.22 |
[안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB (0) | 2022.03.20 |
[안드로이드] 간단한 할 일 목록(ToDoList) 쉽게 만드는 방법 (0) | 2022.03.19 |
[안드로이드] 이미지 원형으로 쉽게 표현하는 방법 (0) | 2022.03.18 |
댓글 영역