https://developer.android.com/reference/android/support/v7/widget/RecyclerView
http://liveonthekeyboard.tistory.com/135
http://www.kmshack.kr/2014/10/android-recyclerview/
[루λΉνμ΄νΌ] λ λκΉμ§ μλλ‘μ΄λ (μ€μ€μ)
-
κΈ°μ‘΄μ ListViewλ 컀μ€ν νκΈ°μλ ꡬ쑰μ μΈ λ¬Έμ λ‘ λ§μ μ μ½μ΄ λ°λμΌλ©°, ꡬ쑰μ μΈ λ¬Έμ λ‘ μΈν΄ μ±λ₯λ¬Έμ κ° μμλ€. κ·Έλμ μ΄ λ¬Έμ λ€μ ν΄κ²°νκΈ° μν΄ μ’ λ λ€μν ννλ‘ κ°λ°μκ° μ»€μ€ν ν μ μλλ‘ λ§λ€μ΄μ§ κ²μ΄ RecyclerView!
-
κΈ°μ‘΄μ ListViewλ³΄λ€ μ μ°νκ³ μ±λ₯μ΄ ν₯μλ κ³ κΈ μμ ―
-
리μ€νΈλ₯Ό νμνκΈ° μν μ΄λν°λ·°λ₯Ό μ’ λ κ°μ ν μ»΄ν¬λνΈ
-
ν° νμ μ μ§ν μ± λ°μ΄ν°λ§ λ°λ
- μ΄λν°λ·°μμ μ°¨μ΄μ
- RecyclerViewλ λ μ΄μμ 맀λμ (LayoutManager)λ₯Ό μ§μ ν΄ μ€μΌ ν¨
- μ΄λν°λ·°μμλ μ νμ¬νμ΄μλ λ·°νλ ν¨λμ΄ RecyclerViewμμλ κΌ κ΅¬νν΄μΌ ν¨
- μ΄λν°λ·°λ 미리 μ 곡λ μ΄λν°κ° μλ λ°λ©΄ RecyclerViewμ μ΄λν°λ μ무κ²λ μ κ³΅ν΄ μ£Όμ§ μμ
- μ₯μ
- ViewHolderν¨ν΄μ μ μ©νμ¬ λ·°λ₯Ό μ¬νμ©
- Swipeλ₯Ό μ΄μ©νμ¬ μ§κ΄μ μΈ Refresh UIꡬ쑰 μ€κ³κ°λ₯
- positionμ λ°λΌμ ν 리μ€νΈ λ΄μμ λ€μν λ·°λ₯Ό ννκ°λ₯(MultiView)
- λ¨μ
- μ΄λ²€νΈ 리μ€λμ 컀μ(Cursor)λ₯Ό μ§μνμ§ μμ
-
λ°μ΄ν°λ₯Ό λ°°μΉνκ³ , λ·°μ μ¬μ¬μ© λ±μ κ²°μ νλ μν μ νμ¬ κΈ°μ‘΄μ μ΄λν°λ·°λ³΄λ€ μ±λ₯μ΄ κ°μ λ¨
-
LinearLayoutManager : λ°μ΄ν°λ₯Ό 리μ€νΈλ·°μ²λΌ μΈλ‘λ κ°λ‘ ν μ€λ‘ νμ
-
GridLayoutManager : 그리λλ·°μ²λΌ λ°μ΄ν°λ₯Ό 그리λ νμμΌλ‘ νμ
-
StaggeredGridLayoutManager : 그리λλ·°μ²λΌ λ°μ΄ν°λ₯Ό 격μ νμμΌλ‘ νμνλ©΄μ μμ΄ν μ λμ΄κ° μΌμ νμ§ μμλ λλ μ§κ·Έμ¬κ·Έν 그리λ νμμΌλ‘ νμ
-
-
λΌμ΄λΈλ¬λ¦¬ μ’ μμ± μΆκ°
dependencies{ ... implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:cardview-v7:26.1.0' }
-
CardView λ μ΄μμ μμ±
-
μ΄λν° μμ±
-
RecyclerView.Adapterλ₯Ό μμλ°μ ꡬνν΄μΌ ν¨
-
λΆλΆμλ RecyclerView.ViewHolder ν΄λμ€λ₯Ό μμν λ·°νλ μ§μ ν΄μΌ ν¨
=> ListViewμμλ λ·°νλ ν¨ν΄ μ¬μ©μ΄ κΆμ₯μ¬νμ΄μμΌλ, RecyclerViewλ μ무
import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder>{ private final List<CardItem> mDataList; public MyRecyclerAdapter(List<CardItem> dataList){ mDataList = dataList; } // λ·° νλλ₯Ό μμ±νλ λΆλΆ. λ μ΄μμμ λ§λλ λΆλΆ @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_card, parent, false); return new ViewHolder(view); } // λ·° νλμ λ°μ΄ν°λ₯Ό μ€μ νλ λΆλΆ @Override public void onBindViewHolder(ViewHolder holder, int position) { // CardItemλ μμ΄ν μ νμν λ°μ΄ν°λ₯Ό κ°μ§λ λͺ¨λΈ ν΄λμ€ CardItem item = mDataList.get(position); holder.title.setText(item.getTitle()); holder.contents.setText(item.getContents()); } //μμ΄ν μ μ @Override public int getItemCount() { return mDataList.size(); } //κ°κ°μ μμ΄ν μ λ νΌλ°μ€λ₯Ό μ μ₯ν λ·° νλ ν΄λμ€ //λ°λμ RecyclerView.ViewHolderλ₯Ό μμν΄μΌ ν¨ public static class ViewHolder extends RecyclerView.ViewHolder{ TextView title; TextView contents; public ViewHolder(View itemview){ super(itemview); title = itemview.findViewById(R.id.title_text); contents = itemview.findViewById(R.id.contents_text); } } }
-
-
λ μ΄μμ 맀λμ μ μ΄λν° μ€μ - LinearLayoutManager
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); //λ μ΄μμ 맀λμ λ‘ LinearLayoutManagerλ₯Ό μ€μ RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); //νμν μμ λ°μ΄ν° List<CardItem> dataList = new ArrayList<>(); // dataList.add(new CardItem(title, contents)); dataList.add(new CardItem("μ΄κ²μ 첫λ²μ§Έ μμ΄ν ", "μλλ‘μ΄λ 보μ΄λΌκ³ ν©λλ€")); dataList.add(new CardItem("μ΄κ²μ λλ²μ§Έ μμ΄ν ", "λ μ€ μ λ ₯\nλ μ€ μ λλ€")); dataList.add(new CardItem("μ΄κ²μ μΈλ²μ§Έ μμ΄ν ", "μΈμ€\nλλ²μ§Έ μ€\nμΈλ²μ§Έ μ€")); dataList.add(new CardItem("μ΄κ²μ λ€λ²μ§Έ μμ΄ν ", "μ λλ€μ!")); //μ΄λν° μ€μ MyRecyclerAdapter adapter = new MyRecyclerAdapter(dataList); recyclerView.setAdapter(adapter); } }
-
λ μ΄μμ 맀λμ μ½λ μ 리
-
LinearLayoutManager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager);
-
GridLayoutManager
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(gridLayoutManager);
-
StaggeredGridLayoutManager
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(gridLayoutManager);
-
-
-
RecyclerView μμ΄ν μ ν΄λ¦ 리μ€λλ₯Ό μ 곡νμ§ μλλ€
=>λͺ¨λ μ΄λ²€νΈμ λν μ²λ¦¬λ₯Ό κ°λ°μκ° μ§μ ꡬνν΄μΌν¨
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder>{
private final List<CardItem> mDataList;
private MyRecyclerViewClickListener mListener;
... μλ΅ ...
public void setOnClickListener(MyRecyclerViewClickListener listener){
mListener = listener;
}
public interface MyRecyclerViewClickListener {
// μμ΄ν
μ 체 λΆλΆμ ν΄λ¦
void onItemClicked(int position);
// share λ²νΌ ν΄λ¦
void onShareButtonClicked(int position);
// Learn More λ²νΌ ν΄λ¦
void onLearnMoreButtonClicked(int position);
}
}
- onBindViewHolder() λ©μλμμ ν΄λ¦μ΄ λ°μνλ κ³³μ MyRecyclerViewClickListenerμ μ°κ²°
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> {
... μλ΅ ...
// λ·° νλμ λ°μ΄ν°λ₯Ό μ€μ νλ λΆλΆ
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
CardItem item = mDataList.get(position);
holder.title.setText(item.getTitle());
holder.contents.setText(item.getContents());
// ν΄λ¦ μ΄λ²€νΈ
if (mListener != null) {
// νμ¬ μμΉ
final int pos = position;
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mListener.onItemClicked(pos);
}
});
holder.share.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mListener.onShareButtonClicked(pos);
}
});
holder.more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onLearnMoreButtonClicked(pos);
}
});
}
}
... μλ΅ ...
// κ°κ°μ μμ΄ν
μ λ νΌλ°μ€λ₯Ό μ μ₯ν λ·° νλ ν΄λμ€
// λ°λμ RecyclerView.ViewHolderλ₯Ό μμν΄μΌ ν¨
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView title;
TextView contents;
Button share;
Button more;
public ViewHolder(View itemview) {
super(itemview);
title = itemview.findViewById(R.id.title_text);
contents = itemview.findViewById(R.id.contents_text);
share = (Button) itemview.findViewById(R.id.share_button);
more = (Button) itemview.findViewById(R.id.more_button);
}
}
... μλ΅ ...
}
- μ‘ν°λΉν°μμ 리μ€λ ꡬν, λ©μλ μ¬μ μ
public class MainActivity extends AppCompatActivity implements MyRecyclerAdapter.MyRecyclerViewClickListener{
private static final String TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
... μλ΅ ...
// μ΄λν° μ€μ
MyRecyclerAdapter adapter = new MyRecyclerAdapter(dataList);
adapter.setOnClickListener(this);
recyclerView.setAdapter(adapter);
}
@Override
public void onItemClicked(int position) {
Log.d(TAG, "onItemClicked: " + position);
}
@Override
public void onShareButtonClicked(int position) {
Log.d(TAG, "onShareButtonClicked: " + position);
}
@Override
public void onLearnMoreButtonClicked(int position) {
Log.d(TAG, "onLearnMoreButtonClicked: " + position);
}
}
- μ½λ°±μ΄ μ λμνλμ§ νμΈ
-
μ΄λν°λ·°μμλ λ°μ΄ν°κ° λ³κ²½λμμ λ μ΄λ₯Ό λ°μνκΈ° μν΄ notifyDataSetChanged() λ©μλλ₯Ό νΈμΆνμ¬ λ°μ΄ν° λ³κ²½μ ν΅μ§νκ³ λ·°κ° μμ λλλ‘ ν¨ => νμ μ 체 νλͺ©μ μλ‘ λ‘λ
-
RecyclerViewμ μ΄λν°λ κ° μν©μ λ§κ² μ¬μ©ν μ μλ ν΅μ§ λ©μλ μ 곡
- notifyItemInserted(int position) : position μμΉμ μμ΄ν μ΄ μ½μ λ κ²μ ν΅μ§
- notifyItemRemoved(int position) : position μμΉμ μμ΄ν μ΄ μμ λ κ²μ ν΅μ§
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.ViewHolder> { ... μλ΅ ... public void removeItem(int position){ mDataList.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mDataList.size()); } public void addItem(int position, CardView item){ mDataList.add(position, item); notifyItemInserted(position); notifyItemRangeChanged(position, mDataList.size()); } }
- μ λ©μλλ€μ μμ΄ν μ΄ μΆκ°, μμ λλ©΄μ κΈ°λ³Έμ μΌλ‘ μ λλ©μ΄μ μ΄ μ§μλ¨
- notifyItemRangeChanged(position, mDataList.size()) λ©μλλ₯Ό νΈμΆν΄μΌ μ λλ‘ μλ
- μ΄ λ©μλλ 첫 λ²μ§Έ μΈμλΆν° λ λ²μ§Έ μΈμ μ¬μ΄μ λ°μ΄ν°κ° λ³κ²½λμμμ ν΅μ§
- μ΄μ λ§κ² μ λλ‘ λμνλλ‘ ν¨
-
ItemAnimatorμ ItemDecoration
-
RecyclerViewλ μ λλ©μ΄μ λͺ¨μμ κΎΈλ° μ μλ λ°©λ²μ μ 곡
-
ItemAnimator
- μμ΄ν μ΄ μΆκ°, μμ , μ λ ¬λ λμ μ λλ©μ΄μ μ μ μν μ μλ ν΄λμ€
- μ΄ ν΄λμ€λ₯Ό μμνλ©΄ μ¬λ¬ κ°μ§ μΆμ λ©μλλ₯Ό ꡬννμ¬ μ λλ©μ΄μ κ΅¬μ± κ°λ₯
-
ItemDecoration
-
μμ΄ν μ λͺ¨μμ κΎΈλ° μ μλ ν΄λμ€
DividerItemDecoration decoration = new DividerItemDecoration(this, layoutManager.getOrientation()); recyclerView.addItemDecoration(decoration);
-
-
DefaultItemAnimator
-
RecyclerViewλ νΉλ³ν μ€μ μ΄ μμΌλ©΄ 미리μ μλ DefaultItemAnimatorκ° μ μ©λ¨
-
μ΄ ν΄λμ€λ μΆκ°, μμ , μ λ ¬ μ λλ©μ΄μ μ μ€ν μλλ₯Ό μ‘°μ ν μ μμ
DefaultItemAnimator animator = new DefaultItemAnimator(); animator.setAddDuration(1000); animator.setremoveDuration(1000); animator.setMoveDuration(1000); animator.setChangeDuration(1000); recyclerView.setItemAnimator(animator);
-
-
-