Programming/Android

[안드로이드] RecyclerView에 대해 간단히 알아보기

devssun 2017. 3. 7. 10:55
728x90
반응형

이번엔 리사이클러뷰

ListView의 작동방식과 비슷하지만 속도가 더 빠르고 약간의 다른 점이 있다.


ListView는 커스터마이징이 하기 힘들고 구조적인 문제가 있기 때문에 RecyclerView에서는 이를 해결을 했다고 한다.


LayoutManager, ViewHolder 패턴, Item에 대한 View의 변형 등이 있다.



리싸이클러뷰가 작동하게 되는데 아래의 그림을 참고할 수 있습니다




Adapter - 기존의 ListView에서 사용하는 Adapter와 같은 개념, 데이터와 Item에 대한 View 생성

ViewHolder - 재사용할 View를 가지고 있음

LayoutManager - Item의 항목을 배치





ViewHolder에는 내가 표시할 View들이 들어있다. 위의 사진에서는 ImageView, TextView를 보여주고 있는데

이 패턴을 사용하지 않을 때는 View를 표시할 때 마다 가져와서 화면에 보여주는 형태였다

그런데 이것은 성능 저하를 일으키고 앱이 중간에 꺼질 수도 있다.. (메모리때문에)


ViewHolder를 사용하면 저장되어있는 View를 가져오므로 속도도 빠르고 수많은 Row가 있어도 성능 저하가 일어나지 않는다



기존 ListView에서는 이 패턴 사용에 대해 강제적이지 않았지만 RecyclerView부터는 ViewHolder패턴 사용을 강제화시켰다

따라서 저 순서를 이해하는 것이 중요하다!!




- ViewHolder 코드 예제

아래와 같이 레이아웃의 View를 미리 정의하여 저장해놓는다 


1
2
3
4
5
6
7
8
9
10
public class Holder extends RecyclerView.ViewHolder{
        public TextView wordText;
        public TextView meaningText;
 
        public Holder(View view){
            super(view);
            wordText = (TextView) view.findViewById(R.id.wordText);
            meaningText = (TextView) view.findViewById(R.id.meaningText);
        }
    }
cs



- Adapter 코드 예제


Adapter 주요 메소드


public Holder onCreateViewHolder(ViewGroup parent, int viewType) - ViewHolder 객체 생성,


레이아웃 인플레이션을 해준 뒤 ViewHolder 객체와 연결한다.

public void onBindViewHolder(Holder holder, int position) - 만들어진 ViewHolder에 data를 삽입,


ListView의 getView와 동일한 함수

public int getItemCount() - 아이템 갯수 리턴 함수, 반드시 리턴해줘야 오류가 안난다





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class MainViewAdapter extends RecyclerView.Adapter<MainViewAdapter.Holder> {
 
    private Context context;
    private List<WordItemData> list = new ArrayList<>();
 
    public MainViewAdapter(Context context, List<WordItemData> list) {
        this.context = context;
        this.list = list;
    }
 
    // ViewHolder 생성
    // row layout을 화면에 뿌려주고 holder에 연결
    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_voca_row, parent, false);
        Holder holder = new Holder(view);
        return holder;
    }
 
    @Override
    public void onBindViewHolder(Holder holder, int position) {
        // 각 위치에 문자열 세팅
        int itemposition = position;
        holder.wordText.setText(list.get(itemposition).word);
        holder.meaningText.setText(list.get(itemposition).meaning);
        Log.e("StudyApp""onBindViewHolder" + itemposition);
    }
 
   ...
}
 
cs



지금 하는거를 깃허브에도 올리려고 하는데 아직 어플이름을 정하지못해서 못올리고있다..

깃을 제대로 사용하진 못해서 아직 수정하는 건 어렵슴 ㅠ


그래도 공부한 걸 하나씩 정리하니 좀 더 이해가 되는 듯 하다

반응형