https://github.com/lnjky/fashion_people
GitHub - lnjky/fashion_people: 패션 추천 어플
패션 추천 어플. Contribute to lnjky/fashion_people development by creating an account on GitHub.
github.com
코드 전체를 보려면 위에 링크를 통해 확인할 수 있습니다.
이전의 게시글 작성 만들기에 이어서 작성하도록 하겠다.
[안드로이드] 파이어스토어 게시글 작성 만들기
https://github.com/lnjky/fashion_people GitHub - lnjky/fashion_people: 패션 추천 어플 패션 추천 어플. Contribute to lnjky/fashion_people development by creating an account on GitHub. github.com 코드 전체를 보려면 위에 링크를 통해
loasd.tistory.com
우선 파이어스토어에 성공적으로 데이터를 추가했다면 이후는 쉽다.
우선 리사이클러뷰를 만들어야 한다.
[안드로이드] 리사이클러뷰 만들기
https://github.com/lnjky/fashion_people GitHub - lnjky/fashion_people: 패션 추천 어플 패션 추천 어플. Contribute to lnjky/fashion_people development by creating an account on GitHub. github.com 코드 전체를 보려면 위에 링크를 통해
loasd.tistory.com
위의 링크를 통해 만들어주도록 하자.
리사이클러뷰의 전체 코드를 우선 보도록 하자.
1) 모델
package com.example.styleplt.models;
import android.provider.ContactsContract;
import com.google.firebase.firestore.ServerTimestamp;
public class board {
private String documentId;
private String title;
private String contents;
private String nickname;
private String collectionId;
private String timestamp;
@ServerTimestamp
private ContactsContract.Data data;
//alt + insert
// 빈 생성자를 만드는 이유 = 만들지 않으면 데이터가 나오지 않음
public board() {
}
public board(String documentId, String title, String contents, String nickname, String collectionId, String timestamp) {
this.documentId = documentId;
this.title = title;
this.contents = contents;
this.nickname = nickname;
this.collectionId = collectionId;
this.timestamp = timestamp;
this.data = data;
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getDocumentId() {
return documentId;
}
public void setDocumentId(String documentId) {
this.documentId = documentId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getCollectionId() {
return collectionId;
}
public void setCollectionId(String collectionId) {
this.collectionId = collectionId;
}
public ContactsContract.Data getData() {
return data;
}
public void setData(ContactsContract.Data data) {
this.data = data;
}
@Override
public String toString() {
return "board{" +
"documentId='" + documentId + '\'' +
", title='" + title + '\'' +
", contents='" + contents + '\'' +
", nickname='" + nickname + '\'' +
", collectionId='" + collectionId + '\'' +
", timestamp='" + timestamp + '\'' +
", data=" + data +
'}';
}
}
가져와야 할 데이터를 선언해주고 데이터를 가져오고 세팅하는 Getter Setter를만들어준다.
2) 어댑터
package com.example.styleplt.adapter;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.styleplt.CommentsActivity;
import com.example.styleplt.R;
import com.example.styleplt.models.board;
import java.util.List;
//리사이클러 뷰 사용을 위한 어댑터 생성
public class boardAdapter extends RecyclerView.Adapter<boardAdapter.boardViewHolder> {
private List<board> datas;
//어댑터에 대한 생성자
public boardAdapter(List<board> datas) {
this.datas = datas;
}
@NonNull
@Override
public boardViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new boardViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_board, parent, false));
}
@Override
public void onBindViewHolder(@NonNull boardViewHolder holder, int position) {
// 각각의 홀더의 위치(position)에 데이터(컨텐츠, 타이틀)를 넣음
// title, nickname, contents 섞임현상으로 임시로 수정
board data = datas.get(position);
holder.board_title.setText("✔" + data.getTitle());
holder.board_contents.setText(data.getContents());
holder.board_nickname.setText(data.getNickname());
holder.board_uid.setText(data.getDocumentId());
holder.board_collectionid.setText(data.getCollectionId());
holder.board_timestamp.setText(data.getTimestamp());
}
private OnItemClickListener mListener = null ;
public interface OnItemClickListener {
void onItemClick(View v, int position) ;
}
// OnItemClickListener 리스너 객체 참조를 어댑터에 전달하는 메서드
public void setOnItemClickListener(OnItemClickListener listener) {
this.mListener = listener ;
}
//데이터의 길이를 전부 가져옴
@Override
public int getItemCount() {
return datas.size();
}
class boardViewHolder extends RecyclerView.ViewHolder {
private TextView board_title;
private TextView board_contents;
private TextView board_nickname;
private TextView board_uid;
private TextView board_timestamp;
private TextView board_collectionid;
//board view holder의 생성자
public boardViewHolder(@NonNull View itemView) {
super(itemView);
// title, nickname, contents 섞임현상으로 임시로 수정
board_title = itemView.findViewById(R.id.item_board_nickname);
board_nickname = itemView.findViewById(R.id.item_board_contents);
board_contents = itemView.findViewById(R.id.item_board_title);
board_uid = itemView.findViewById(R.id.item_board_uid);
board_timestamp = itemView.findViewById(R.id.item_board_timestamp);
board_collectionid = itemView.findViewById(R.id.item_board_collectionid);
Log.d("holder", "title = " + board_title.getText().toString());
Log.d("holder", "title = " + board_nickname.getText().toString());
// 리사이클러뷰 아이템 클릭 리스너
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int position = getAdapterPosition();
if(position != RecyclerView.NO_POSITION) {
if (mListener != null) {
mListener.onItemClick(view, position);
}
}
// 클릭한 아이템의 정보를 CommentActivity로 전송
Intent intent = new Intent(view.getContext(), CommentsActivity.class);
intent.putExtra("board_title", board_title.getText().toString());
intent.putExtra("board_contents", board_contents.getText().toString());
intent.putExtra("board_nickname", board_nickname.getText().toString());
intent.putExtra("board_documentID", board_uid.getText().toString());
intent.putExtra("board_timestamp", board_timestamp.getText().toString());
intent.putExtra("board_collectionID", board_collectionid.getText().toString());
Log.d("holder", "title = " + board_title.getText().toString());
view.getContext().startActivity(intent);
}
});
}
}
}
모델에서 가져온 값들을 뷰홀더를 통해 연결해준다.
최하단의 Intent는 나중에 댓글을 작성할 때 사용하기 때문에 해당 글에서는 없어도 된다.
3) Board Fragment
실질적으로 리사이클러뷰를 연결해주고 띄우는 장소이다.
나는 Fragment에 리사이클러뷰를 만들었고 Activity여도 상관없다.
우선 리사이클러뷰, 어댑터, 모델을 연결해준다.
private RecyclerView mBoardRecyclerView;
private boardAdapter mAdapter;
private List<board> mDatas;
그리고 onCreate 밖에 onStart를 만들어준다.
전체 코드는 다음과 같다.
// 시작시 리사이클러뷰를 통해 작성한 글 나열
@Override
public void onStart() {
super.onStart();
mDatas = new ArrayList<>();
mStore.collection(FirebaseID.post)
.orderBy(FirebaseID.timestamp, Query.Direction.DESCENDING) // DESCENDING = 오름차순, ASCENDING = 내림차순 정렬
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
if (value != null) {
mDatas.clear();
for (DocumentSnapshot snap : value.getDocuments()) {
Map<String, Object> shot = snap.getData();
String documentID = String.valueOf(shot.get((FirebaseID.documentId)));
String nickname = String.valueOf(shot.get(FirebaseID.nickname));
String title = String.valueOf(shot.get(FirebaseID.title));
String contents = String.valueOf(shot.get(FirebaseID.contents));
String collectionID = String.valueOf(shot.get(FirebaseID.collectionId));
String timestamp = String.valueOf(shot.get(FirebaseID.timestamp));
board data = new board(documentID, nickname, title, contents, collectionID, timestamp);
mDatas.add(data);
}
mAdapter = new boardAdapter(mDatas);
mBoardRecyclerView.setAdapter(mAdapter);
RecyclerDecoration spaceDecoration = new RecyclerDecoration(10);
mBoardRecyclerView.addItemDecoration(spaceDecoration);
}
}
});
}
이제 이 코드를 살펴보도록 하자.
우선 post 컬렉션의 글을 가져오기 때문에 경로를 이렇게 지정해주었다.
mStore.collection(FirebaseID.post)
그리고 정렬을 하기 위해 다음과 같은 구문을 추가해준다.
// DESCENDING = 오름차순, ASCENDING = 내림차순 정렬
.orderBy(FirebaseID.timestamp, Query.Direction.DESCENDING)
그리고 스냅샷 리스너를 통해 값들을 가져온다.
각각 선언된 String에 전달된 데이터들을 넣어주고 해당 구문을 통해 값을 입력해서 띄워준다.
board data = new board(documentID, nickname, title, contents, collectionID, timestamp);
mDatas.add(data);
그리고 마지막으로 리사이클러뷰와 어댑터를 연결해준다.
mAdapter = new boardAdapter(mDatas);
mBoardRecyclerView.setAdapter(mAdapter);
추가로 아래의 구문을 추가시 리사이클러뷰의 간격을 설정해줄 수 있다.
RecyclerDecoration spaceDecoration = new RecyclerDecoration(10);
mBoardRecyclerView.addItemDecoration(spaceDecoration);
아래의 링크에서 사용방법을 설명해 두었다.
[안드로이드] 리사이클러뷰 간격 조정
https://github.com/lnjky/fashion_people GitHub - lnjky/fashion_people: 패션 추천 어플 패션 추천 어플. Contribute to lnjky/fashion_people development by creating an account on GitHub. github.com 코드 전체를 보려면 위에 링크를 통해
loasd.tistory.com
OnStart 안에 넣으면 아이템이 생성될때마다 늘어나기 때문에 주의해야 한다.
이렇게 2개의 게시글을 통해 파이어스토어를 활용한 게시글 작성법을 알아보았다.
'안드로이드' 카테고리의 다른 글
[안드로이드] 댓글 작성 만들기 (0) | 2023.01.05 |
---|---|
[안드로이드] 별점 추가하기 ( XML ) (0) | 2023.01.05 |
[안드로이드] 파이어스토어 게시글 작성 만들기 (0) | 2023.01.05 |
[안드로이드] 파이어스토어의 데이터 가져오기 (0) | 2023.01.05 |
[안드로이드] 플로팅 버튼 ( 게시글 작성 버튼 ) (0) | 2023.01.04 |