v7 에 추가된 RecyclerView 에 대해 알아보자 #1
참조 : http://antonioleiva.com/recyclerview
RecyclerView? 그게 뭐야?
RecyclerView 는 새로운 ViewGroup 이며, ListView 의 확장판이라고도 불린다.
최신 support-v7 에 포함되었다.
RecyclerView 는 확장성을 고려하여 생성되었다.
RecyclerView 를 사용하기 위해서는 RecyclerView.Adapter, LayoutManager 이렇게 2개의 컴퍼넌트가 필요하고, 필요에 따라 ItemAnimator, ItemDecorator 등이 추가될 수 있다.
RecyclerView.Adatper
RecyclerView 의 Adapter 는 기존에 사용되던 패턴을 포함한다.
기존의 Adapter 에 ViewHolder 를 포함한 격이다.
onCreateViewHolder 와 onBindViewHolder, 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());
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
이클립스 실행시 Java was started but returned exit code=1 에러가 날때 (0) | 2015.06.23 |
---|---|
@SerialzedName 어노테이션 (0) | 2015.06.20 |
.idea 폴더가 뭔가요? (0) | 2015.06.14 |
android largeheap (0) | 2015.06.06 |
iml 파일이 뭔가요? ( git repository 에 올리는 게 맞나요? ) (0) | 2015.06.04 |
댓글