RecyclerView란?
사용자가 관리하는 많은 수의 데이터 집합(Data Set)을 개별 아이템 단위로 구성하여 화면에 출력하는 뷰그룹(ViewGroup)이며,
한 화면에 표시되기 힘든 많은 수의 데이터를 스크롤 가능한 리스트로 표시해주는 위젯"이다.
대표적 유튜브 메인화면이 있다.
RecyclerView의 장점
ListView를 사용해도 스크롤 형태의 컨텐츠를 만들 수 있겠지만 RecyclerView는 한개의 레이아웃만 만들어놓으면 그 레이아웃을 반복해서 내용만 다르게
표시할 수 있다.
RecyclerView 구성요소
DATA LIST
데이터 목록을 아이템 단위의 뷰로 구성
Adapter
데이터 목록을 화면에 표시.
LayoutManager
화면에 표시될 아이템 뷰들이 형태 관리
ViewHolder
어댑터를 통해 만들어진 각 아이템 뷰를 ViewHolder 객체에 저장되어 화면에 표시.
사용법
레이아웃 리소스(xml)에 RecyclerView
<android.support.v7.widget.RecyclerView android:id="@+id/recycler1" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/>
Recyclerview 아이템 레이아웃 추가(Activity의 xml과는 별도로 생성)
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="<http://schemas.android.com/apk/res/android>" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/text1" android:textSize="32sp"/> </android.support.constraint.ConstraintLayout>
Adapter 구현
RecyclerView.Adapter를 상속받아 새로운 어댑터를 만들 때, 오버라이드가 필요한 메서드는 아래와 같다.
onCreateViewHolder(ViewGroup parent, int viewType)
viewType 형태의 아이템 뷰를 위한 뷰홀더 객체 생성.
onBindViewHolder(ViewHolder holder, int position)
position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
getItemCount()
전체 아이템 갯수 리턴.
이걸 바탕으로 java코드 작성. (RecyclerViewAdpater라는 별도 클래스 생성)
public class RecyclerViewAdpater extends RecyclerView.Adapter<RecyclerViewAdpater.ViewHolder> { private ArrayList<String> mData = null ; // 아이템 뷰를 저장하는 뷰홀더 클래스. public class ViewHolder extends RecyclerView.ViewHolder { TextView textView1 ; ViewHolder(View itemView) { super(itemView) ; // 뷰 객체에 대한 참조. (hold strong reference) textView1 = itemView.findViewById(R.id.text1) ; } } // 생성자에서 데이터 리스트 객체를 전달받음. SimpleTextAdapter(ArrayList<String> list) { mData = list ; } // onCreateViewHolder() - 아이템 뷰를 위한 뷰홀더 객체 생성하여 리턴. @Override public SimpleTextAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Context context = parent.getContext() ; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ; View view = inflater.inflate(R.layout.recyclerview_item, parent, false) ; SimpleTextAdapter.ViewHolder vh = new SimpleTextAdapter.ViewHolder(view) ; return vh ; } // onBindViewHolder() - position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시. @Override public void onBindViewHolder(SimpleTextAdapter.ViewHolder holder, int position) { String text = mData.get(position) ; holder.textView1.setText(text) ; } // getItemCount() - 전체 데이터 갯수 리턴. @Override public int getItemCount() { return mData.size() ; } }
Activity 클래스에 Adapter와 LayoutManager 지정하기
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { // ... 코드 계속 // 리사이클러뷰에 표시할 데이터 리스트 생성. ArrayList<String> list = new ArrayList<>(); for (int i=0; i<100; i++) { list.add(String.format("TEXT %d", i)) ; } // 리사이클러뷰에 LinearLayoutManager 객체 지정. RecyclerView recyclerView = findViewById(R.id.recycler1) ; recyclerView.setLayoutManager(new LinearLayoutManager(this)) ; // 리사이클러뷰에 SimpleTextAdapter 객체 지정. SimpleTextAdapter adapter = new SimpleTextAdapter(list) ; recyclerView.setAdapter(adapter) ; }
실행해보면 액티비티에
TEXT 0 TEXT 1 TEXT 2 TEXT 3 . . .
이 표시될 거다.
댓글