- ✔sharePoint 변경 기능 구현 - 게시글 작성 시 sharePoint 받음
- ✔안드로이드 게시글 작성 시 해시태그 작성 기능 추가하기 , 게시글 조회에도 해시태그 뜨도록 변경
- ✔안드로이드 검색창 생성하기, 검색 기능 구현하기
- ✔해시태그 기반 검색 기능 구현하기
1. Retrofit2 기본사용 - PUT Mapping
2. How to update RecyclerView Adapter Data
3. [Java][Android] 리사이클러뷰 검색 필터링 구현하기
- 💥게시글 작성부터 sharepoint 증가까지 일괄로 이루어지지 않으면 rollback 하도록 transaction 구현하기 어떻게 하지?
- 💥Retrofit 에서 error 처리 부분들을 하나의 인터페이스 메서드로 처리해도 되겠다. 계속 반복됨ㅠㅠ
- Q 연관관계 매핑에 대한 현타.. 예를 들어서 포스트해시태그로 해당 해시태그가 있는 게시글들로 바로 이동할때 포스트해시태그에서 해당하는 해시태그 get 해오고, 해당 해시태그를 posthashtag로 갖고있는 포스트를 조회하는 것보다 그냥 각 게시글마다 해시태그 컬럼 따로있고 pk, fk 안물리고 생으로 조회하는게 더 성능이 낫지 않나...? -> 일단 이게 최선인 걸로
'@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
저렇게 특정 값만을 바꿔주고 싶을 떄 엄청 유용하게 쓸 수 있을 것 같다.
- 클래스명을 Acitivity ->Fragment로 바꾸고 extends Fragment로 변경
- [replace] this ->getAcitivity()
- sharedPreference의 경우 getPreference -> this.getActivity.getPreference 로 변경
생각보다 간단하다. 여기서의 핵심은 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 형태로 데이터의 변경됨을 알렸다.
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);
}
};
filterList
메서드를 생성한다.public void filterList(ArrayList<ItemData> filteredList) {
ItemArrayList = filteredList;
notifyDataSetChanged();
}
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);
}
이제 해시태그 기반 검색까지 얼추 된다! 절반은 온 것 같다 ㅎㅎㅎㅎ