상세 컨텐츠

본문 제목

[안드로이드] ToDoList SQLite 만드는 방법 part3 - 수정, 삭제

안드로이드

by aries574 2022. 3. 22. 13:33

본문


이번 시간에는 저번 포스팅에 이어서 하겠습니다. 

마지막으로 수정 및 삭제 기능을 추가해 보겠습니다. 

2022.03.21 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록

 

[안드로이드] ToDoList SQLite 만드는 방법 part2 - 조회, 등록

이번 시간에는 저번 포스팅에 이어서 하겠습니다. 저번에 만든 DB와 화면에 조회와 등록하는 기능을 추가해 보겠습니다. 2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화

aries574.tistory.com


목차

1. 실행 화면

2. 라이브러리 등록

3. 메인 코드 구현 MainActivity.java


1. 실행 화면

 

2. 라이브러리 등록

build.gradle(Module:프로젝트명:app)

dependencies 괄호 안에 아래 코드를 넣어주시면 됩니다.

implementation 'com.github.xabaras:RecyclerViewSwipeDecorator:1.4'

 

setting.gradle

repositories 괄호 안에 아래 코드를 넣어주시면 됩니다.

maven { url 'https://jitpack.io' }

 

3. 메인 코드 구현 MainActivity.java

 - 추가 코드 - 

 //스와이프 기능(수정, 삭제)
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

                int position = viewHolder.getAdapterPosition();

                switch(direction){

                    //삭제 기능
                    case ItemTouchHelper.LEFT:

                        //할일 ID 변수에 담기
                        int id = taskList.get(position).getId();

                        //아이템 삭제
                        adapter.removeItem(position);

                        //DB에서 삭제
                        db.deleteTask(id);

                        break;

                    //수정 기능
                    case ItemTouchHelper.RIGHT:
                        
                        viewMode("UPDATE");

                        String task = taskList.get(position).getTask();

                        //할일 ID 전역변수에 담기
                        gId = taskList.get(position).getId();

                        //입력창에 수정할 할일 넣기
                        todoText.setText(task);

                        addBtn.setText("UPDATE");

                        break;
                }
            }
            
            @Override
            public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

                new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder,
                        dX, dY, actionState, isCurrentlyActive)
                        .addSwipeLeftBackgroundColor(Color.RED)      //왼쪽 스와이프 배경색 설정
                        .addSwipeLeftActionIcon(R.drawable.ic_delete)//왼쪽 스와이프 아이콘 설정
                        .addSwipeLeftLabel("삭제")                    //왼쪽 스와이프 라벨 설정
                        .setSwipeLeftLabelColor(Color.WHITE)         //왼쪽 스와이프 라벨 색상
                        .addSwipeRightBackgroundColor(Color.BLUE)    //오른쪽 스와이프 배경색 설정
                        .addSwipeRightActionIcon(R.drawable.ic_edit) //오른쪽 스와이프 아이콘 설정
                        .addSwipeRightLabel("수정")                   //오른쪽 스와이프 라벨 설정
                        .setSwipeRightLabelColor(Color.WHITE)        //오른쪽 스와이프 라벨 색상
                        .create()
                        .decorate();

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }).attachToRecyclerView(recyclerView);

 

 

 - 전체 코드 - 

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) { }
        });

        //스와이프 기능(수정, 삭제)
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

                int position = viewHolder.getAdapterPosition();

                switch(direction){

                    //삭제 기능
                    case ItemTouchHelper.LEFT:

                        //할일 ID 변수에 담기
                        int id = taskList.get(position).getId();

                        //아이템 삭제
                        adapter.removeItem(position);

                        //DB에서 삭제
                        db.deleteTask(id);

                        break;

                    //수정 기능
                    case ItemTouchHelper.RIGHT:
                        
                        viewMode("UPDATE");
                        
                        String task = taskList.get(position).getTask();

                        //할일 ID 전역변수에 담기
                        gId = taskList.get(position).getId();

                        //입력창에 수정할 할일 넣기
                        todoText.setText(task);

                        addBtn.setText("UPDATE");

                        break;
                }
            }

            @Override
            public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

                new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder,
                        dX, dY, actionState, isCurrentlyActive)
                        .addSwipeLeftBackgroundColor(Color.RED)      //왼쪽 스와이프 배경색 설정
                        .addSwipeLeftActionIcon(R.drawable.ic_delete)//왼쪽 스와이프 아이콘 설정
                        .addSwipeLeftLabel("삭제")                    //왼쪽 스와이프 라벨 설정
                        .setSwipeLeftLabelColor(Color.WHITE)         //왼쪽 스와이프 라벨 색상
                        .addSwipeRightBackgroundColor(Color.BLUE)    //오른쪽 스와이프 배경색 설정
                        .addSwipeRightActionIcon(R.drawable.ic_edit) //오른쪽 스와이프 아이콘 설정
                        .addSwipeRightLabel("수정")                   //오른쪽 스와이프 라벨 설정
                        .setSwipeRightLabelColor(Color.WHITE)        //오른쪽 스와이프 라벨 색상
                        .create()
                        .decorate();

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }).attachToRecyclerView(recyclerView);
    }//onCreate

    //데이터 조회
    public void selectData(){

        //전체 할일 가져오기
        taskList = db.getAllTasks();

        //정렬
        Collections.reverse(taskList);

        //담기
        adapter.setTasks(taskList);

        //목록 체인지
        adapter.notifyDataSetChanged();
    }

    //조회 및 리셋
    public void selectReset(String type){

        //조회
        selectData();

        //초기화
        todoText.setText("");

        //등록이 아니면 등록으로 변경
        if(!type.equals("ADD")){
            addBtn.setText("ADD");
        }
    }

    //화면 상태
    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);
        }
    }

    //키보드 숨김
    private void hideKeyboard(EditText editText){

        InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        //키보드 숨김
        manager.hideSoftInputFromWindow(editText.getApplicationWindowToken(), 0);
    }

}//MainActivity

 아이콘 res -> drawable

ic_edit.xml
0.00MB
ic_delete.xml
0.00MB

 

2022.03.16 - [안드로이드] - [안드로이드] Firebase Storage 이미지 업로드 part1

 

[안드로이드] Firebase Storage 이미지 업로드 part1

이번 시간에는 Firebase를 통해서 이미지를 업로드하는 방법을 알아보겠습니다. 간단하게 설명하자면 Firebase의 Storage에 이미지를 업로드하고, 이미지가 저장된 주소를 Realtime Database에 저장합니다.

aries574.tistory.com

2022.03.17 - [안드로이드] - [안드로이드] Firebase Storage 이미지 리스트 part2

 

[안드로이드] Firebase Storage 이미지 리스트 part2

이번 시간에는 Firebase를 통해서 업로드한 이미지를 가져와서 리스트로 보여주는 방법을 알아보겠습니다. 이전에 했던 포스팅을 이어서 하니 먼저 보시면 됩니다. 2022.03.16 - [안드로이드] - [안드

aries574.tistory.com

2022.03.18 - [안드로이드] - [안드로이드] 이미지 원형으로 쉽게 표현하는 방법

 

[안드로이드] 이미지 원형으로 쉽게 표현하는 방법

이번 시간에는 이미지를 원형으로 보여줘야 하는 프로필 화면에서 쓸 수 있는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. 메인 화면 구성 activity_main.xml 4. 메인 코드 구현 Mai

aries574.tistory.com

반응형

관련글 더보기

댓글 영역