개요
RecyclerView 는 ListView에서 진화한 형태입니다.
RecyclerView는 ListView와 다르게 LaayoutManager와 View Holder 사용해야하며, Item에 대한 View의 변형이나 애니메이션할 수 있는 개념이 추가되었습니다.
주요 클래스
Adapter : 아이템에 대한 View 생성
ViewHolder : 재활용 View에 대한 모든 서브 View를 관리
LayoutManager : 아이템 항목 배치
ItemDecoration : 아이템 항목에서 서브뷰에 대한 처리
ItemAnimation : 아이템 항목 애니메이션 처리
RecyclerView 예제
자세한 설명은 생략하고 바로 예제를 통해 접근해 보겠습니다.
Library 추가
가장 먼저 프로젝트를 생성하고, recyclerView 를 사용하기 위해 Library를 추가해줍니다.
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.2.0'
compile 'com.android.support:recyclerview-v7:25.2.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
|
dependency에 아래 내용이 잘 추가되었는지 확인 할 수 있습니다.
compile 'com.android.support:recyclerview-v7:25.2.0'
|
레이아웃 구성
[activity_main.xml]
(생략)
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
(생략)
|
[item.xml]
(생략)
<TextView
android:id="@+id/index"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:layout_weight="1"
/>
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:layout_weight="1"
/>
(생략)
|
>> 간단하게 TextView를 사용했지만 얼마든지 원하는 형태로 바꾸셔도 됩니다.
Activity 구성
[Item.java]
public class Item {
String index;
String name;
public String getIndex() {
return index;
}
public String getName() {
return name;
}
public Item(String index, String name) {
this.index = index;
this.name = name;
}
}
|
>> 데이터를 넣을 객체입니다. 숫자, 이름 두개 정도로 구성하였습니다.
RecyclerView에 출력될 내용으로 보셔도 될 것 같습니다.
[MainActivity.java]
public class MainActivity extends AppCompatActivity {
RecyclerView mRecyclerView;
LinearLayoutManager mLayoutManager;
RecyclerViewAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);
mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
// ArrayList 에 Item 객체(데이터) 넣기
ArrayList<Item> items = new ArrayList();
items.add(new Item("1", "하나"));
items.add(new Item("2", "둘"));
items.add(new Item("3", "셋"));
items.add(new Item("4", "넷"));
items.add(new Item("5", "다섯"));
// LinearLayout으로 설정
mRecyclerView.setLayoutManager(mLayoutManager);
// Animation Defualt 설정
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
// Decoration 설정
// mRecyclerView.addItemDecoration(new RecyclerViewDecoration(this, RecyclerViewDecoration.VERTICAL_LIST));
// Adapter 생성
mAdapter = new RecyclerViewAdapter(items);
mRecyclerView.setAdapter(mAdapter);
}
}
|
>> Animation은 Default로 설정했습니다...
[RecyclerVeiwAdapter.java]
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
private ArrayList<Item> mItems;
Context mContext;
public RecyclerViewAdapter(ArrayList itemList) {
mItems = itemList;
}
// 필수 오버라이드 : View 생성, ViewHolder 호출
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
mContext = parent.getContext();
RecyclerViewHolder holder = new RecyclerViewHolder(v);
return holder;
}
// 필수 오버라이드 : 재활용되는 View 가 호출, Adapter 가 해당 position 에 해당하는 데이터를 결합
@Override
public void onBindViewHolder(RecyclerViewHolder holder, final int position) {
// 해당 position 에 해당하는 데이터 결합
holder.mIndex.setText(mItems.get(position).index);
holder.mName.setText(mItems.get(position).name);
// 이벤트처리 : 생성된 List 중 선택된 목록번호를 Toast로 출력
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, String.format("%d 선택", position + 1), Toast.LENGTH_SHORT).show();
}
});
}
// 필수 오버라이드 : 데이터 갯수 반환
@Override
public int getItemCount() {
return mItems.size();
}
}
|
>> 흐름을 확인해보면 View 를 생성하고 재활용 View에서 OnBindViewHolder 를
호출하여 데이터를 매칭시킵니다.
사용자가 선택한 List에 대한 이벤트처리부분도 확인할 수 있습니다.
[RecycleViewHolder.java]
public class RecyclerViewHolder extends RecyclerView.ViewHolder {
public TextView mIndex;
public TextView mName;
public RecyclerViewHolder(View itemView) {
super(itemView);
mIndex = (TextView) itemView.findViewById(R.id.index);
mName = (TextView) itemView.findViewById(R.id.name);
}
}
|
결과
[Related Post]
좋은 자료 감사합니다. 다만 소스코드 다운이 안되는데 별도로 다운로드 할 수 있는 방법이 없을까요?
답글삭제답변이 늦었습니다ㅠㅠ
삭제본문 하단에 "소스코드 다운로드" 링크를 클릭해서 페이지 들어가시면
오른쪽 상단 버튼으로 다운로드 가능합니다.