본문 바로가기
프로그래밍 놀이터/안드로이드, 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());









반응형

댓글