개요 RecyclerView 는 ListView에서 진화한 형태입니다. RecyclerView는 ListView와 다르게 LaayoutManager와 View Holder 사용해야하며, Item에 대한 View의 변형이나 애니...

[안드로이드] RecyclerView 간단한 예제 정리




개요

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]






댓글 2개:

  1. 좋은 자료 감사합니다. 다만 소스코드 다운이 안되는데 별도로 다운로드 할 수 있는 방법이 없을까요?

    답글삭제
    답글
    1. 답변이 늦었습니다ㅠㅠ
      본문 하단에 "소스코드 다운로드" 링크를 클릭해서 페이지 들어가시면
      오른쪽 상단 버튼으로 다운로드 가능합니다.

      삭제