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 | 31 | 
													Tags
													
											
												
												- 막내의막무가내 일상
- 2022년 6월 일상
- Fragment
- 막내의막무가내 알고리즘
- 막내의 막무가내
- 막내의막무가내 목표 및 회고
- 막내의막무가내 플러터 flutter
- 막내의막무가내 프로그래밍
- 부스트코스에이스
- 막내의막무가내 SQL
- 막내의막무가내 플러터
- 부스트코스
- flutter network call
- 막내의막무가내 회고 및 목표
- 안드로이드 sunflower
- 막내의 막무가내 알고리즘
- 막내의막무가내 안드로이드 코틀린
- 안드로이드
- 안드로이드 Sunflower 스터디
- 막내의막무가내
- 막내의막무가내 코틀린 안드로이드
- 막내의막무가내 코볼 COBOL
- 프로그래머스 알고리즘
- 막내의막무가내 안드로이드
- 막내의막무가내 코틀린
- 주엽역 생활맥주
- 막내의막무가내 rxjava
- 막무가내
- 막내의막무가내 안드로이드 에러 해결
- 프래그먼트
													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
			                 
                 
  
  
		
	
               
           
					
					
					
					
					
					
				 
								 
								