관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 파이어베이스 리사이클러뷰 정리 본문

안드로이드/자바 & Previous

[안드로이드] 파이어베이스 리사이클러뷰 정리

막무가내막내 2019. 5. 10. 15:10
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
Comments