RecyclerView 안드로이드에서 보통 리스트를 구현할 때는 ListView를 이용하지만 웹에서의 대용량 데이터를 처리할 때에 ListView를 사용하게 되면 버벅이는 현상을 보게 될 것이다. RecyclerView는 List구성에 성능을 개선한 최적화된 안드로이드 support.widget의 View이다.
참고 page : https://developer.android.com/training/material/lists-cards.html
The RecyclerView class simplifies the display and handling of large data sets by providing: - Layout managers for positioning items
- Default animations for common item operations, such as removal or addition of items
You also have the flexibility to define custom layout managers and animations for RecyclerView widgets. ![](https://developer.android.com/training/material/images/RecyclerView.png)
Figure 1. The RecyclerView widget.
즉 LayoutManager를 이용하여 item을 위치시키고, item 삭제나 생성과 같은 operation에 animation 효과를 준다.
구현 방법
List에 붙일 커스텀 아답터를 만들기 위해서는 다음과 같은 절차가 필요하다. 1. RecyclerView.Adapter를 상속하여 커스텀 아답터를 정의 해 주어야 한다.
2. 리스트의 커스텀 레이아웃을 ViewHolder에 구성하여 onCreateViewHolder에서 view를 생성한다. 3. 커스텀 레이아웃에서 구성한 각 view를 ViewHolder를 이용하여 리스트를 구성한다. 4. getItemCount에 리스트가 몇개가 구성되는지 정의해 주어야 한다. (필자는 이 부분을 생략하여 리스트가 구성이 안되어 몇시간 삽질한 경험이 있음...) 5. 각 리스트 item클릭시 동작은 onBindViewHolder에서 객체에 리스너를 등록하여 정의할 수 있다. 예제 화면 : 아래와 같은 화면을 RecyclerView를 이용해 구현 해 보자. ![](http://ssiso.net/cafe/_blog_image/android/34929/test_1.png)
ex 1) MyAdapter.java
public class MyAdapter extends RecyclerView.Adapter {
private ArrayList mDataset;
public MyAdapter(ArrayList searchDataSet, Activity activity) {
mDataset = searchDataSet;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_view, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mNumberView.setImageResource(mDataset.get(position).number_img);
holder.mTextView.setText(mDataset.get(position).text);
holder.mPrivateImage.setImageResource(mDataset.get(position).private_img);
holder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// click 시 필요한 동작 정의
}
});
}
@Override
public int getItemCount() {
return mDataset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView mNumberView;
public TextView mTextView;
public ImageView mPrivateImage;
public ViewHolder(View view) {
super(view);
mNumberView = (ImageView) view.findViewById(R.id.number_image);
mTextView = (TextView) view.findViewById(R.id.search_text);
mPrivateImage = (ImageView) view.findViewById(R.id.private_icon);
}
}
}
ex 2) 데이터 MyData.java public class MyData {
public int number_img;
public String text;
public int private_img;
public MyData(int number_img, String text, int private_img) {
this.number_img = number_img;
this.text = text;
this.private_img = private_img;
}
}
ex 3) Fragment.java에서 사용하기
public class MyFragment extends Fragment {
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
private ArrayList mMyData;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.crew_search_fragment, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.search_recycler_view);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.scrollToPosition(0);
mAdapter = new MyAdapter(mMyData);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initDataset();
}
private void initDataset() {
//for Test
mSearchData = new ArrayList<>();
mSearchData.add(new MyData(R.drawable.number1, "JOY MINI (48/50)", R.drawable.private_icon));
mSearchData.add(new MyData(R.drawable.number2, "RALLYIST (5/50)", R.drawable.public_icon));
mSearchData.add(new MyData(R.drawable.number3, "TEST (10/30)", R.drawable.private_icon));
}
}
|