티스토리 뷰
RecyclerView
ListView와의 차이점
|
RecyclerView |
ListView |
ViewHolder |
ViewHolder 패턴을 이용한다. RecyclerView.Viewholder |
ViewHolder 패턴을 이용할 필요가 없다. |
Item Layout |
가로/세로/지그재그 방향 모두 지원한다. RecyclerView.LayoutManager |
세로 방향만 지원한다. |
Item Animation |
아이템 애니메이션을 처리하는 클래스가 있다. RecyclerView.ItemAnimator | 아이템이 추가/제거될 때에 적용할 수 있는 애니메이션이 없다. |
Adapter |
데이터를 제공하기 위한 사용자 정의 구현이 필요하다. RecyclerView.Adapter |
배열/DB 결과에 대한 ArrayAdapter/CursorAdapter와 같은 다양한 소스에 대한 어댑터가 존재한다. |
Decoration |
RecyclerView.ItemDecoration 객체를 사용하여 더 많은 구분선을 설정해야한다. |
android:divider 속성을 이용하여 리스트에 있는 아이템들을 쉽게 구분할 수 있다. |
Click Detection |
개별 터치 이벤트를 관리하지만 클릭 처리 기능이 내장되어 있지 않다. RecyclerView.OnItemTouchListener |
목록의 개별 항목에 대한 클릭 이벤트에 바인딩하기 위한 AdapterView.OnItemClickListener 인터페이스가 있다. |
예제 실행 화면
예제 코드
1) Data
public class Contact { private String mName; private boolean mOnline; public Contact(String name, boolean online) { mName = name; mOnline = online; } public String getName() { return mName; } public boolean isOnline() { return mOnline; } private static int lastContactId = 0; public static ListcreateContactsList(int numContacts) { List contacts = new ArrayList<>(); for (int i = 1; i <= numContacts; i++) { contacts.add(new Contact("Person " + ++lastContactId, i <= numContacts / 2)); } return contacts; } }
각각의 item들에 들어갈 정보들이 있는 class
2) Adapter
public class ContactsAdapter extends ListAdapter
{ private List mContacts = new ArrayList<>(); public static final DiffUtil.ItemCallback DIFF_CALLBACK = new DiffUtil.ItemCallback () { @Override public boolean areItemsTheSame(Contact oldItem, Contact newItem) { return oldItem.getId() == newItem.getId(); } @Override public boolean areContentsTheSame(Contact oldItem, Contact newItem) { return (oldItem.getName() == newItem.getName() && oldItem.isOnline() == newItem.isOnline()); } }; public ContactsAdapter() { super(DIFF_CALLBACK); } public void addMoreContacts(List newContacts) { mContacts.addAll(newContacts); submitList(mContacts); // DiffUtil takes care of the chekc } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Context context = parent.getContext(); LayoutInflater inflater = LayoutInflater.from(context); View contactView = inflater.inflate(R.layout.item_contact, parent, false); ViewHolder viewHolder = new ViewHolder(contactView); return viewHolder; } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { Contact contact = getItem(position); TextView textView = viewHolder.nameTextView; textView.setText(contact.getName()); Button button = viewHolder.messageButton; if (contact.isOnline()) { button.setText("Message"); // OMIT to show that rows are recycled. // // Scrolling past the midpoint of the list (when contacts are listed as offline) // and scrolling back up should result in some buttons being inadvertently disabled. button.setEnabled(true); } else { button.setText("Offline"); button.setEnabled(false); } } public static class ViewHolder extends RecyclerView.ViewHolder { public TextView nameTextView; public Button messageButton; public ViewHolder(View itemView) { // Stores the itemView in a public final member variable that can be used // to access the context from any ViewHolder instance. super(itemView); nameTextView = (TextView) itemView.findViewById(R.id.contact_name); messageButton = (Button) itemView.findViewById(R.id.message_button); } } }
- getItemCount > onCreateViewHolder > onBindViewHolder 순서로 실행된다.
- onCreateViewHolder : ViewHolder를 생성
- onBindViewHolder : 만들어진 ViewHolder에 데이터를 넣는 작업
- addMoreContacts : notifyItemRangeInserted를 호출하여 추가적인 정보가 있으면 UI에 반영한다.
3) MainActivity
public class MainActivity extends Activity { ContactsAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setupViews(); } void setupViews() { RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); // Setup RecyclerView, associated adapter, and layout manager. adapter = new ContactsAdapter(); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // Populate contact list. adapter.addMoreContacts(Contact.createContactsList(20)); // Setup button to append additional contacts. Button addMoreButton = (Button) findViewById(R.id.add_more_contacts); addMoreButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { adapter.addMoreContacts(Contact.createContactsList(5)); } }); } }
adapter를 연결해준다.
전체코드는 아래 링크를 통해 볼 수 있습니다.
'android' 카테고리의 다른 글
[안드로이드] ListView, ArrayAdapter 사용하기 (1) | 2018.07.04 |
---|---|
[안드로이드] TextInputLayout, EditText (hint/placeholder, error message, 문자열 counting, password visibility) (0) | 2018.06.29 |
[안드로이드] view layouts (3) FrameLayout (0) | 2018.06.28 |
[안드로이드] view layouts (2) RelativeLayout, PercentRelativeLayout (0) | 2018.06.28 |
[안드로이드] view layouts (1) LinearLayout (0) | 2018.06.28 |
- Total
- Today
- Yesterday
- 운영체제
- RelativeLayout
- 안드로이드
- windows
- layout
- 네트워크
- BOJ
- listview
- 이진탐색트리
- HTTP
- DATABASE
- 백준
- 백준알고리즘
- 퀵정렬
- debug
- 정렬 알고리즘
- 스프링부트
- WinDbg
- Android
- frameLayout
- C
- LinearLayout
- OS
- C++
- adapter
- 스프링
- 알고리즘
- handshake
- 윈도우
- ConstraintLayout
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |