[AndroidStudio] KnockKock 개발일지 -0223(SharePoint 기능 구현, Adapter데이터 추가 삭제, 해시태그)

Hyebin Lee·2022년 2월 24일
0

knockknock 개발일지

목록 보기
24/29
post-thumbnail

오늘의 목표

  1. ✔sharePoint 변경 기능 구현 - 게시글 작성 시 sharePoint 받음
  2. ✔안드로이드 게시글 작성 시 해시태그 작성 기능 추가하기 , 게시글 조회에도 해시태그 뜨도록 변경
  3. ✔안드로이드 검색창 생성하기, 검색 기능 구현하기
  4. ✔해시태그 기반 검색 기능 구현하기

참고한 링크

1. Retrofit2 기본사용 - PUT Mapping
2. How to update RecyclerView Adapter Data
3. [Java][Android] 리사이클러뷰 검색 필터링 구현하기

오늘의 이슈

  1. 💥게시글 작성부터 sharepoint 증가까지 일괄로 이루어지지 않으면 rollback 하도록 transaction 구현하기 어떻게 하지?
  2. 💥Retrofit 에서 error 처리 부분들을 하나의 인터페이스 메서드로 처리해도 되겠다. 계속 반복됨ㅠㅠ
  3. Q 연관관계 매핑에 대한 현타.. 예를 들어서 포스트해시태그로 해당 해시태그가 있는 게시글들로 바로 이동할때 포스트해시태그에서 해당하는 해시태그 get 해오고, 해당 해시태그를 posthashtag로 갖고있는 포스트를 조회하는 것보다 그냥 각 게시글마다 해시태그 컬럼 따로있고 pk, fk 안물리고 생으로 조회하는게 더 성능이 낫지 않나...? -> 일단 이게 최선인 걸로

PUT API 통신에서 @Field 사용하기

'@FormUrlEncoded
    @PUT("api/member/sharePoint/{id}")
    Call<MemberBasicInfo> sharePoint(@Path("id") String id, @Field("point") int point);

안드로이드 스튜디오에서 Retrofit을 활용할 api코드를 위와 같이 @Field어노테이션을 활용해서 사용했다면,

 @PutMapping("api/member/sharePoint/{id}")
    public MemberBasicInfo sharePoint(@PathVariable("id") String id, @FieldValue("point") int point){
       Member member = memberService.changeSharePoint(id,point);
       MemberBasicInfo response = new MemberBasicInfo(member.getNickName(), member.getUserId(),member.getSharePoint());
       log.info("response = {}",response);
       return response;
    }

서버에서는 @FieldValue로 받아오면 된다.
SO EASY
저렇게 특정 값만을 바꿔주고 싶을 떄 엄청 유용하게 쓸 수 있을 것 같다.

Activity를 Fragment로 바꾸는 몇 가지 절차

  1. 클래스명을 Acitivity ->Fragment로 바꾸고 extends Fragment로 변경
  2. [replace] this ->getAcitivity()
  3. sharedPreference의 경우 getPreference -> this.getActivity.getPreference 로 변경

Adapter 데이터 변경시 RecyclerView에 즉각 반영하는 법

생각보다 간단하다. 여기서의 핵심은 Adpater의 list를 변경시켜준 뒤 adapter.notifyXXX 메서드를 사용하는 것.
예를 들어 댓글을 삭제하면 즉각적으로 댓글 recyclerview에 작성한 댓글이 추가되도록 구현하려면 아래 코드와 같이 하면 된다.

if(response.isSuccessful()){ // 댓글 작성이 완료되면
                                        // 댓글 recyclerView 리프래쉬해서 바로 작성자가 작성한 댓글이 보이도록 설정
                                        CommentData savedComment = response.body();
                                        comments.add(savedComment);
                                        recyclerAdapter.notifyItemInserted(comments.indexOf(savedComment));
                                        commentrecyclerView.invalidate();
                                        Toast.makeText(context,"댓글 작성이 완료되었습니다.",Toast.LENGTH_LONG).show();
                                    }

이게 가능한 이유는 위에 안나왔지만 response 코드는 댓글 save 통신의 성공 리턴값이고 그 리턴값은 저장된 CommentData 하나이므로
방금 저장되고 다시 리턴된 덧글 데이터를 response에서 받아와서 recycler에 올릴 CommentData list에 추가한 후
recyclerAdapter.notifyItem 형태로 데이터의 변경됨을 알렸다.

Fragment간 이동시 데이터 주고받기

public static PostdetailFragment newInstance(Long postid) {

        Bundle args = new Bundle();
        args.putLong("postId",postid);
        PostdetailFragment fragment = new PostdetailFragment();
        fragment.setArguments(args);
        return fragment;
    }

Fragment 객체를 생성할 때 Bundle 에서 데이터를 put 형태로 넣고 해당 Bundle을 fragment의 setArgument 메서드로 argument화 한다.
참고로 위와 같은 newInstance 함수는 Fragment 마다 널리 쓰이는 함수이므로 고정적으로 구현해주는 것이 좋다.

 if(getArguments()!=null){
            tag = getArguments().getString("hashtag");
        }

데이터를 받을 때는 다음과 같이 argument가 있다면 key값으로 가져오는 코드를 구현하면 된다. 아주 쉽다.

RecyclerAdapter 에서 하나의 ItemView를 클릭했을 때 특정 Fragment로 넘어가는 코드도 이를 응용하면 된다.

    holder.itemClickListener = new ItemClickListener() {
        @Override
        public void onItemClickListener(View v, int position) {
            //detail post로 이동하기 위해 post id를 postdetail fragment로 넘기고 실행
            Long postId = postlist.get(position).getId();
            Bundle bundle = new Bundle(); // 번들에 post id 담기
            bundle.putLong("postId",postId);

            //넘어갈 postdetail fragment
            PostdetailFragment postdetailFragment = new PostdetailFragment();
            postdetailFragment.setArguments(bundle); // 번들과 같이 넘기기
            ((MainActivity) c).replaceFragment(postdetailFragment);

        }
    };

EditText로 RecyclerView 반응형 검색창 만들기

  • RecyclerAdapter에 filterList메서드를 생성한다.
public void  filterList(ArrayList<ItemData> filteredList) {
        ItemArrayList = filteredList;
        notifyDataSetChanged();
    }
  • 검색창으로 쓸 EditText View를 추가한다.
  • Fragment/ Activity에서 EditText에 글자가 감지될 때마다 활동을 하도록 메서드를 구현한다.
 searchET.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) {

            }

            @Override
            public void afterTextChanged(Editable editable) {

                String searchText = searchET.getText().toString();
                searchFilter(searchText);

            }
        });
  • searchFilter 함수는 검색어와 해시태그 내용의 일부가 일치하는 게시글을 retrofit 통신으로 받아온 게시글 list를 탐색하며 찾아 filterList에 추가해주고 해당 filterlist를 다시 adapter로 recyclerview에 올리는 내용이다.
public void searchFilter(String searchText) {
        filteredList.clear();

        for (int i = 0; i < ItemArrayList.size(); i++) {
            if (ItemArrayList.get(i).getName().toLowerCase().contains(searchText.toLowerCase())) {
                filteredList.add(ItemArrayList.get(i));
            }
        }

        recyclerAdapter.filterList(filteredList);
    }

이제 해시태그 기반 검색까지 얼추 된다! 절반은 온 것 같다 ㅎㅎㅎㅎ

0개의 댓글