상세 컨텐츠

본문 제목

[안드로이드] Database Room 사용법 part5 - 삭제

안드로이드

by aries574 2022. 5. 18. 16:28

본문


이번 시간에는 리스트에 있는 사용자를

왼쪽으로 스와이프 해서 사용자 삭제를

하는 방법에 대하여 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.05.17 - [안드로이드] - [안드로이드] Database Room 사용법 part4 - 수정

 

[안드로이드] Database Room 사용법 part4 - 수정

이번 시간에는 리스트에 있는 사용자를 선택하면 수정 화면으로 이동하여 사용자 정보를 변경하는 방법을 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.05.16 - [안드로이

aries574.tistory.com


목차

1. 실행 화면
2. 라이브러리 등록
3. 아이템 어뎁터 수정
4. 메인 코드 수정 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. 아이템 어텝터 수정

 - 추가 -

  사용자 삭제 메서드

   //사용자 삭제
    public void deleteUser(int position){

        this.userList.remove(position);
    }

 

- 전체 코드 -

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.MyViewHolder>{

    List<User> userList;

    Context context;

    public UserAdapter(Context context) {
        this.context = context;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        View view = inflater.inflate(R.layout.list_item, parent, false);

        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

        int mPosition = holder.getAdapterPosition();

        holder.nameText.setText(userList.get(mPosition).userName);
        holder.ageText.setText(userList.get(mPosition).userAge);

        //수정화면으로 이동
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(context, UpdateActivity.class);
                intent.putExtra("uId", userList.get(mPosition).uid);
                intent.putExtra("userName", userList.get(mPosition).userName);
                intent.putExtra("userAge", userList.get(mPosition).userAge);
                context.startActivity(intent);
            }
        });
    }

    @Override
    public int getItemCount() {
        return this.userList.size();
    }

    //리스트 저장
    public void setUserList(List<User> userList){

        this.userList = userList;
        notifyDataSetChanged();
    }

    //사용자 삭제
    public void deleteUser(int position){

        this.userList.remove(position);
    }

    class MyViewHolder extends RecyclerView.ViewHolder{

        TextView nameText, ageText;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            nameText = itemView.findViewById(R.id.name_text);
            ageText = itemView.findViewById(R.id.age_text);
        }
    }
}


4. 메인 코드 수정 MainActivity.java

 - 추가 -

 제스처 기능 구현

 onSwiped 제스처 기능 구현

 onChildDraw 제스처 그림 구현

        //삭제 제스처
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @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.getBindingAdapterPosition();

                switch(direction){

                    case ItemTouchHelper.LEFT:

                        //사용자 클래스 생성
                        User user = new User();
                        user.uid = userList.get(position).uid;

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

                        //아이템 삭제 화면 재정리
                        adapter.notifyItemRemoved(position);

                        //DB생성
                        AppDatabase db = AppDatabase.getDBInstance(getApplicationContext());

                        //삭제 쿼리
                        db.userDao().userDelete(user);

                        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) //왼쪽 스와프 텍스트 색상
                        .create() // 생성
                        .decorate();

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }).attachToRecyclerView(recyclerView); //RecyclerView에 적용

 아이콘 res -> drawable

ic_delete.xml
0.00MB

 - 전체 코드 -

public class MainActivity extends AppCompatActivity {

    UserAdapter adapter;

    List<User> userList;

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

        FloatingActionButton fab = findViewById(R.id.insertBtn);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(MainActivity.this, InsertUserActivity.class);
                activityResult.launch(intent);
            }
        });

        //RecyclerView 초기화 및 설정
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        //UserAdapter 초기화
        adapter = new UserAdapter(MainActivity.this);

        //RecyclerView Adapter 설정
        recyclerView.setAdapter(adapter);

        //사용자 조회
        loadUserList();

        //삭제 제스처
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @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.getBindingAdapterPosition();

                switch(direction){

                    case ItemTouchHelper.LEFT:

                        //사용자 클래스 생성
                        User user = new User();
                        user.uid = userList.get(position).uid;

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

                        //아이템 삭제 화면 재정리
                        adapter.notifyItemRemoved(position);

                        //DB생성
                        AppDatabase db = AppDatabase.getDBInstance(getApplicationContext());

                        //삭제 쿼리
                        db.userDao().userDelete(user);

                        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) //왼쪽 스와프 텍스트 색상
                        .create() // 생성
                        .decorate();

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }).attachToRecyclerView(recyclerView); //RecyclerView에 적용
    }

    //액티비티 백그라운드에 있는데 호출되면 실행
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        //사용자 조회
        loadUserList();
    }

    ActivityResultLauncher<Intent> activityResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {

                    if(result.getResultCode() == RESULT_OK){

                        //사용자 조회
                        loadUserList();
                    }
                }
            }
    );

    //사용자 조회
    private void loadUserList() {

        AppDatabase db = AppDatabase.getDBInstance(this.getApplicationContext());

        userList = db.userDao().getAllUser();

        //리스트 저장
       adapter.setUserList(userList);
    }
}

2022.04.08 - [안드로이드] - [안드로이드] Tab Custom Animation part1 - 화면 구성

 

[안드로이드] Tab Custom Animation part1 - 화면 구성

이번 시간부터 TabLayout을 직접 만들어 애니메이션까지 넣어보는 방법을 알아보겠습니다. 이번 포스팅은 화면 구성을 해보겠습니다. 목차 1. 실행 화면 2. 테마 변경 3. 배경 색상 파일 만들기(drawab

aries574.tistory.com

2022.03.20 - [안드로이드] - [안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB

 

[안드로이드] ToDoList SQLite 만드는 방법 part1 - 화면과 DB

이번 시간에는 ToDoList SQLite 할 일 목록 화면과 DB부분을 만들어 보겠습니다. 목차 1. 실행 화면 2. 라이브러리 등록 3. ToDo 클래스 만들기 4. ToDo DB 만들기 5. ToDo 화면 만들기 6. 메인 화면 구성 acti..

aries574.tistory.com

2022.03.09 - [안드로이드] - [안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1

 

[안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part

이번 시간에는 Firebase를 통해 데이터베이스에 간단한 데이터를 쓰고 읽는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 프로젝트 만들기 3. 앱 만들기 4. 데이터 베이스 만들기 5. 라이브러

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역