250x250
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 안드로이드
- 막무가내
- 막내의 막무가내
- 2022년 6월 일상
- 안드로이드 sunflower
- 막내의막무가내 안드로이드 코틀린
- flutter network call
- 막내의막무가내 목표 및 회고
- 막내의막무가내 SQL
- 막내의막무가내 안드로이드
- 주엽역 생활맥주
- Fragment
- 막내의 막무가내 알고리즘
- 막내의막무가내 알고리즘
- 막내의막무가내
- 주택가 잠실새내
- 막내의막무가내 일상
- 안드로이드 Sunflower 스터디
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 안드로이드 에러 해결
- 프래그먼트
- 막내의막무가내 rxjava
- 막내의막무가내 코틀린
- 프로그래머스 알고리즘
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 플러터 flutter
- 막내의막무가내 플러터
- 부스트코스에이스
- 부스트코스
- 막내의막무가내 프로그래밍
Archives
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] 파이어베이스 리사이클러뷰 정리 본문
728x90
FIrebase RecyclerView를 써봤고 해당코드들을 정리한 포스팅을 하겠습니다.
query를 사용해 DB값을 가져온다는거 외에는 리사이클러 뷰와 동일하다고 볼 수 있으므로 리사이클러뷰 참조할때 보셔도 될것 같습니다. 그냥 리사이클러뷰의 경우에는 밑의 생성자부분과 클래스 extends를 다음과 같이 바꿔주면 될것입니다.
파이어베이스 리사이클러뷰 어댑터
public MessageAdapter(@NonNull FirebaseRecyclerOptions<StudyMessage> options, Context context) {
super(options); //options는 파이어베이스 리사이클러뷰에 DB의 쿼리문옵션을 넣어 해당 쿼리문에 맞는 데이터들을 자동 세팅해주기 위해서 사용합니다.
this.context = context; //Glide 서울액티비티쪽에 사용하기위해 필요
}
public class MessageAdapter extends FirebaseRecyclerAdapter<StudyMessage, MessageAdapter.MessageViewHolder>
기본 리사이클러뷰 어댑터 (다른코드에서 가져온거라 클래스명이 틀린건 이해부탁드립니다.
public PhotoVideoAdapter(Context context) {
this.context = context;
}
public class PhotoVideoAdapter extends RecyclerView.Adapter<PhotoVideoAdapter.ViewHolder> {
추가적으로 한가지 차이점을 더 말씀드리면 기본리사이클러뷰는 ArrayList를 하나 선언해서 해당 리스트에 데이터리스트들을 저장하는데 파이어베이스 리사이클러뷰의 경우는 options 즉 쿼리문으로 데이터베이스에서 값을 자동으로 불러와주기 떄문에 따로 ArrayList를 사용하지않습니다.
이제 파이어베이스 리사이클러뷰 어댑터 부분 코드를 보겠습니다.
package com.mtjin.studdytogether.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.mtjin.studdytogether.R;
import com.mtjin.studdytogether.cities.SeoulActivity;
import com.mtjin.studdytogether.realtime_database.StudyMessage;
import de.hdodenhof.circleimageview.CircleImageView;
public class MessageAdapter extends FirebaseRecyclerAdapter<StudyMessage, MessageAdapter.MessageViewHolder> {
Context context;
/**
* Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
* {@link FirebaseRecyclerOptions} for configuration options.
*
* @param options
*/
public MessageAdapter(@NonNull FirebaseRecyclerOptions<StudyMessage> options, Context context) {
super(options); //options는 파이어베이스 리사이클러뷰에 DB의 쿼리문옵션을 넣어 해당 쿼리문에 맞는 데이터들을 자동 세팅해주기 위해서 사용합니다.
this.context = context; //Glide 서울액티비티쪽에 사용하기위해 필요
}
@Override //홀더가 갖고있는 뷰에 데이터들을 세팅해줍니다.
protected void onBindViewHolder(@NonNull MessageViewHolder holder, int position, @NonNull StudyMessage model) {
holder.titleTextView.setText(model.getTitle());
holder.nickNameTextView.setText(model.getNickName());
holder.ageTextView.setText(model.getAge());
holder.messageTextView.setText(model.getContent());
if(model.getImage().equals("basic")) { //프로필사진이 없는경우
Glide.with(context).load("https://firebasestorage.googleapis.com/v0/b/studdytogether.appspot.com/o/Basisc%2FbasicProfile.png?alt=media&token=dd0e0e17-a057-40a4-ae7f-364fa529e2a3").into(holder.photoImageView);
}else{
Glide.with(context).load(model.getImage()).into(holder.photoImageView);
}
if(model.getPhoto() != "basic") {
Glide.with(context).load(model.getPhoto()).into(holder.messageImageView);
}else{
//사진첨부안했으니 안올림
}
holder.datesTextView.setText(model.getDates());
}
@NonNull
@Override //뷰를 담을 수 있는 뷰홀더를 생성해줍니다.
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_message, viewGroup, false); //우리가쓸려는 chatMessage아이템의 뷰객체 생성
return new MessageViewHolder(view); //각각의 chatMessage아이템을 위한 뷰를 담고있는 뷰홀더객체를 반환한다.
}
//뷰들을 바인딩 해줍니다.
public static class MessageViewHolder extends RecyclerView.ViewHolder {
TextView titleTextView;
TextView nickNameTextView;
TextView ageTextView;
ImageView messageImageView;
TextView messageTextView;
CircleImageView photoImageView;
TextView datesTextView;
public MessageViewHolder(@NonNull View itemView) {
super(itemView);
titleTextView = itemView.findViewById(R.id.message_tv_title);
nickNameTextView = itemView.findViewById(R.id.message_tv_name);
ageTextView = itemView.findViewById(R.id.message_tv_age);
messageImageView = itemView.findViewById(R.id.message_iv_photo); //업로드한사진
messageTextView = itemView.findViewById(R.id.message_tv_message);
photoImageView = itemView.findViewById(R.id.message_iv_profile); //내 프로필사진
datesTextView = itemView.findViewById(R.id.message_tv_date); //글쓴 날짜
}
}
}
다음은 파이어베이스 어댑터 세팅 및 생성단계입니다.
private FirebaseRecyclerAdapter<StudyMessage, MessageAdapter.MessageViewHolder> mFirebaseAdapter;
DatabaseReference mRootDatabaseReference = FirebaseDatabase.getInstance().getReference(); //데이터베이스 위치한곳
DatabaseReference mSeoulDatabaseReference = mRootDatabaseReference.child("seoulStudy"); //profile이란 이름의 하위 데이터베이스
mMessageRecyclerView = findViewById(R.id.seoul_rev_message); //채팅메세지들 리사이클러뷰
Query query = mSeoulDatabaseReference; //쿼리문의 수행위치 저장 (파이어베이스 리얼타임데이터베이스의 하위에있는 MESSAGES_CHILD에서 데이터를 가져오겠다는 뜻이다. ==> 메세지를 여기다 저장했으므로)
FirebaseRecyclerOptions<StudyMessage> options = new FirebaseRecyclerOptions.Builder<StudyMessage>() //어떤데이터를 어디서갖고올거며 어떠한 형태의 데이터클래스 결과를 반환할거냐 옵션을 정의한다.
.setQuery(query, StudyMessage.class)
.build();
mFirebaseAdapter = new MessageAdapter(options, getApplicationContext());
//아래구분선 세팅
mMessageRecyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL));
// 리사이클러뷰에 레이아웃 매니저와 어댑터를 설정한다.
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, true); //레이아웃매니저 생성
mMessageRecyclerView.setLayoutManager(layoutManager); ////만든 레이아웃매니저 객체를(설정을) 리사이클러 뷰에 설정해줌
mMessageRecyclerView.setAdapter(mFirebaseAdapter); //어댑터 셋 ( 파이어베이스 어댑터는 액티비티 생명주기에 따라서 상태를 모니터링하게하고 멈추게하고 그런 코드를 작성하도록 되있다.==> 밑에 onStart()와 onStop에 구현해놨다)
// 키보드 올라올 때 RecyclerView의 위치를 마지막 포지션으로 이동
mMessageRecyclerView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
if (bottom < oldBottom) {
v.postDelayed(new Runnable() {
@Override
public void run() {
mMessageRecyclerView.smoothScrollToPosition(mFirebaseAdapter.getItemCount());
}
}, 100);
}
}
});
/*// 새로운 글이 추가되면 제일 하단으로 포지션 이동
mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
int friendlyMessageCount = mFirebaseAdapter.getItemCount();
LinearLayoutManager layoutManager = (LinearLayoutManager) mMessageRecyclerView.getLayoutManager();
int lastVisiblePosition = layoutManager.findLastCompletelyVisibleItemPosition();
if (lastVisiblePosition == -1 ||
(positionStart >= (friendlyMessageCount - 1) &&
lastVisiblePosition == (positionStart - 1))) {
mMessageRecyclerView.scrollToPosition(positionStart);
}
}
});*/
이상포스팅을 마치겠습니다.
728x90
'안드로이드 > 자바 & Previous' 카테고리의 다른 글
[안드로이드] 리사이클러뷰(RecyclerView) 표본 (0) | 2019.05.19 |
---|---|
[안드로이드] 파이어베이스 리얼타임데이터베이스, 스토리지 중간정리 (4) | 2019.05.11 |
[안드로이드] 리사이클러뷰 아래 구분선 주는 방법 (0) | 2019.05.07 |
[안드로이드] 카메라로 찍고 해당 이미지 세팅하기 + 예제는 마지막꺼 참고해주세요 (39) | 2019.05.01 |
[안드로이드] 쉽게 로딩 프로그레스 다이얼로그(ProgressDialog) 구현방법 (2) | 2019.05.01 |
Comments