본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] v7 에 추가된 RecyclerView 에 대해 알아보자 #1

by 돼지왕 왕돼지 2015. 6. 15.
반응형

v7 에 추가된 RecyclerView 에 대해 알아보자 #1


참조 : http://antonioleiva.com/recyclerview




adapter, ADD, Android, animate, component, defaultitemanimator, getitemcount, getView, itemanimator, LayoutManager, linearlayoutmanager, listview, Notify, notifyDataSetChanged, notifyiteminserted, notifyitemremoved, onbindviewholder, oncreateviewholder, override, Position, recyclerview, recycling, remove, Screen, scrolling, setAdapter, sethasfixedsize, setitemanimator, setlayoutmanager, setup, support-v7, v7, v7 에 추가된 RecyclerView 에 대해 알아보자 #1, View, viewgroup, viewholder, 안드로이드, 컴퍼넌트, 확장성, 확장판


RecyclerView? 그게 뭐야?


RecyclerView 는 새로운 ViewGroup 이며, ListView 의 확장판이라고도 불린다.

최신 support-v7 에 포함되었다.


RecyclerView 는 확장성을 고려하여 생성되었다.


RecyclerView 를 사용하기 위해서는 RecyclerView.Adapter, LayoutManager 이렇게 2개의 컴퍼넌트가 필요하고, 필요에 따라 ItemAnimator, ItemDecorator 등이 추가될 수 있다.





RecyclerView.Adatper


RecyclerView 의 Adapter 는 기존에 사용되던 패턴을 포함한다.

기존의 Adapter 에 ViewHolder 를 포함한 격이다.

onCreateViewHolderonBindViewHolder, getItemCount 이렇게 3개의 function 을 override 한다.

좋은 점은 onCreateViewHolder 는 정말 새롭게 생성될 때에만 불린다.

기존의 getView 처럼 매번 불려 null check 하여 생성할 필요가 없다.



public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {

 

    private List<ViewModel> items;

    private int itemLayout;

 

    public MyRecyclerAdapter(List<ViewModel> items, int itemLayout) {

        this.items = items;

        this.itemLayout = itemLayout;

    }

 

    @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);

        return new ViewHolder(v);

    }

 

    @Override public void onBindViewHolder(ViewHolder holder, int position) {

        ViewModel item = items.get(position);

        holder.text.setText(item.getText());

        holder.image.setImageBitmap(null);

        Picasso.with(holder.image.getContext()).cancelRequest(holder.image);

        Picasso.with(holder.image.getContext()).load(item.getImage()).into(holder.image);

        holder.itemView.setTag(item);

    }

 

    @Override public int getItemCount() {

        return items.size();

    }

 

    public static class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView image;

        public TextView text;

 

        public ViewHolder(View itemView) {

            super(itemView);

            image = (ImageView) itemView.findViewById(R.id.image);

            text = (TextView) itemView.findViewById(R.id.text);

        }

    }

}



이 어댑터의 또 하나의 특징은 notifyDataSetChanged() 대신에

nofiyItemInserted( int position ) 과 notifyItemRemoved( int position ) 이 추가되었다.

아마도 전체적으로 refresh 하는 대신 특정 부분만 refresh 함으로써

drawing 능력을 향상시켰을 것이라 예상된다.


그래서 아래와 같은 function 들을 추가할 수 있다.







public void add(ViewModel item, int position) {

    items.add(position, item);

    notifyItemInserted(position);

}

 

public void remove(ViewModel item) {

    int position = items.indexOf(item);

    items.remove(position);

    notifyItemRemoved(position);

}





LayoutManager


Screen 의 어느 부분에 view 가 놓여야 할지를 결정하는 데 사용된다.

이 뿐만이 아니라 scrolling 과 recycling 에도 관여한다.


LayoutManager 는 abstract class 로 LinearLayoutManager 가 현재 제공되는 구현체이다.

이 녀석은 header 와 footer 가 없는 listview 에 흡사하다.





ItemAnimator


ItemAnimator 는 adapter 가 notify 를 받았을 때 ViewGroup 을 어떻게 animate 할지 결정한다.

기본적으로 add, remove 의 animation 은 제공된다.

이 녀석도 확장해서 쓰는 것이 쉽지 않는데, DefaultItemAnimator 가 대부분의 기초를 서포트한다.





RecyclerView Setup


RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);

recyclerView.setHasFixedSize(true);

recyclerView.setAdapter(new MyRecyclerAdapter(createMockList(), R.layout.item));

recyclerView.setLayoutManager(new LinearLayoutManager(this));

recyclerView.setItemAnimator(new DefaultItemAnimator());









반응형

댓글2

  • 초보개발자 2016.05.16 11:53

    안녕하세요~ 유이한 글 보던 중 질문이 있어서 남겨봅니다.

    RecyclerView와 ListView를 혼용해서 쓰고 싶은데 어떤 방법이 있을까요?

    layout에서 RecyclerView, ListView 둘 다 주고 라디오버튼으로 Visible을 gone,visible 을 주면서 해보니까

    RecyclerView가 영역을 먹는건지 ListView쪽이 나올 생각을 안하더라구요...ㅎ
    답글

    • 음.. 답변이 늦었습니다~
      그냥 글로만 봐서는 이유를 정확히 모르겠지만, RecyclerView 나 ListView 나 모두 동일한 View 이기 떄문에,
      GONE, VISIBLE 로 컨트롤하면 나와야 정상입니다..
      Layouting 에서 뭔가 문제가 있는게 아닌가 확인해봐야 할 것 같습니다~