본문 바로가기
Android

[안드로이드] RecyclerView

by Sky Titan 2020. 8. 23.
728x90
 

RecyclerView로 목록 만들기  |  Android 개발자  |  Android Developers

RecyclerView를 사용하여 동적 콘텐츠의 목록과 그리드를 표시합니다.

developer.android.com

 

RecyclerView

  • 스크롤이 가능한 컨테이너에 여러 개의 뷰를 담아서 보여주는 뷰 그룹
  • 기존의 ListView는 100개의 item을 표시한다고 하면 100개의 view 객체를 일일이 다 생성
  • RecyclerView는 화면에 보여지는 일정 갯수의 ViewHolder 객체만 생성 후 스크롤할 때마다 화면 밖으로 나간 view의 정보를 재활용한다. (화면에 나타나지 않는 뷰를 가져와서 화면에 스크롤되는 데이터와 바인딩)
  • adapter를 통해 item 리스트들을 RecyclerView에 binding 시킨다.
  • LayoutManager를 활용하여 각 item을 화면에 보여주는 방법 컨트롤

 

  1. LinerLayoutManger
    • item들을 하나의 수직, 혹은 수평리스트로 배치
  2. GridLayoutManager
    • item들을 그리드 형태로 배치
    • 수직 배치일 땐 각 항목의 높이 동일
    • 수평 방향일 땐 각 항목의 너비 동일
  3. StaggeredGridLayoutManager
    • 그리드 레이아웃과 비슷하나 셀마다 높이, 너비가 다름

 

EX)

<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerview_group"
            items="@{viewModel.item_list}"
            android:layout_marginTop="10dp"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintTop_toBottomOf="@+id/member_add_btn_group"
            app:layout_constraintBottom_toBottomOf="parent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            ></androidx.recyclerview.widget.RecyclerView>

package com.jun.moiso.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;

import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ObservableArrayList;
import androidx.databinding.ViewDataBinding;
import androidx.recyclerview.widget.RecyclerView;

import com.jun.moiso.R;
import com.jun.moiso.databinding.MemberlistItemBinding;
import com.jun.moiso.model.MemberListItem;
import com.jun.moiso.viewmodel.GroupViewModel;

public class GroupAdapter extends RecyclerView.Adapter<GroupAdapter.MemberViewHolder<MemberlistItemBinding>> {

    private GroupViewModel groupViewModel;
    private ObservableArrayList<MemberListItem> memberListItems = new ObservableArrayList<>();
    private Context context;

    public GroupAdapter(Context context, GroupViewModel groupViewModel) {
        this.groupViewModel = groupViewModel;
        this.context = context;
    }

    @NonNull
    @Override
    public MemberViewHolder<MemberlistItemBinding> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        return new MemberViewHolder<>(inflater.inflate(R.layout.memberlist_item, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull final MemberViewHolder<MemberlistItemBinding> holder,final int position) {
        holder.binding().setItem(memberListItems.get(position));

     
    }



   
    @Override
    public int getItemCount() {
        return memberListItems.size();
    }

    class MemberViewHolder<T extends ViewDataBinding> extends RecyclerView.ViewHolder{
        private final T binding;

        public MemberViewHolder(final View v){
            super(v);
            this.binding = (T) DataBindingUtil.bind(v);

        }

        public T binding() {
            return binding;
        }
    }
}

 groupAdapter = new GroupAdapter(context, viewModel);
 recyclerView.setAdapter(groupAdapter);

 

728x90

댓글