티스토리 뷰

IT study/android

Recycler view and adapters

까자미가 카카로트냐 2018. 3. 14. 13:37


1.

Forecast weather views

뷰는 각각 리스트 아이템은 각각의 이미지와 텍스트 블락을 가지고 있는 연속적인 views 를 구성한다

이는 다른 폰트 사이즈들과 이미지들을 포함하고 있는 rich experience를 만들 수 있게 한다

리스트의 이 영역만이 보여줄수있을지라도, 코드는 생성(create)해야하고, 놓여야하고(lay out), 모든 off 스크린 views상에 덧붙여야한다(populate) 

게다가, 디스플레이되어지는 어떤 이미지들은 메모리상에 상주되어져아한다.

이는 포맷팅을 적게하고 작은 리스트를 사용하도록 하는게 합리적이나, 큰 리스트들에 대해서는

비실용적이게 된다.

리스트상에 각각의 아이템에 대해서는 상호작용이 다뤄져야 할 것이다. 예를 들어, 클릭 핸들러에 할당한다든지,,

보여지는 게 될 때까지 이 모든 셋업 시간은 유저 experiences 연기시킬 것이다. 


설상가상으로, 디스플레이 되야 하는 모든 이들 아이템들과 어떠한 이미지들 메모리에 한 번 올라가고, 이는 out of memeory 원인이 될 수 있다. 


우리는 다른 방법이 필요하다



2.

Gmail 처럼, 무수히 많은 메세지를 보여줘야 할 때 어떻게 해야 할까?

이는 리사이클링과 RecyclerView 를 사용해서 할 수 있다

코드는  스크롤인 할 때 리스트 아이템 뷰에 바인드 되어서 보여진다

스크롤아웃시 재사용을 위해 큐로 돌아간다 


3.

Recycler View 사용하기

거의 모든 recycler view의 부분은 완전하게 모듈러이다

recycler view는 아답터를 가지고 이는 필요시 recycler view가 새로운 뷰들로 제공하는데 사용되어진다

아답터는 어떤 DataSource 로 부터 뷰들로 데이타를 바인드하는데 사용되어진다. 



Gradle Scrips

 

// TODO (1) Add RecyclerView dependency

compile 'com.android.support:recyclerview-v7:25.1.0'


activity_main.xml

RecyclerView 추가한다


// create Adapter

class GreenAdapter extends RecyclerView.Adapter<GreenAdapter.NumberViewHolder>


// layout - create xml file

list_item 을 만든다

<FrameLayout><TextView/></FrameLayout>


public NumberViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {}

public void onBindViewHolder(NumberViewHolder holder, int position) {}

public int getItemCount() {return mNumberItems;}



Adapter 내에 

public class NumberViewHolder extends RecyclerView.ViewHolder{

    

    TextView listItemNumberView;


    public NumberViewHolder(View itemView){

        super(itemView);

        listItemNumberView =   (TextView)itemView.findViewById(R.id.tv_item_number)

    }

    

    void bind(int listIndex){             listItemNumberView.setText(String.valueOf(listIndex));

    }

}





여기에 item layout 과 RecyclerView에 대한 ViewHolder 있다. RecycleView에 datasource를 연결하기 위해서 Adapter 를 생성해야 한다. 


Adapter 는 RecyclerView에 의해 호출되는데, 이는 ViewHolders 형태로, 새로운 items를 생성한다. 이것은 또한, 이들 items들과 데이타를 덧붙이고 바인드한다. 그리고 데이타에 관한 정보를 리턴한다. 

이 데이타는 array list 나 네트웍요청의 결과로 생기는 json 또는 모델하기 나름의 데이타 소스들로 부터 온다


Adapter 는 세개의 함수들을 override한다. 

1. onCreateViewHolder - RecyclerView가 새로운 ViewHolder instance를 instantiate.

2. onBindViewHolder - RecyclerView가 우리모델로부터의 데이타와 view를 덧붙힌다. 그래서 유저는 내용을 볼 수 있고, 그 것을 데이타소스에 바인딩한다. 

3. getItemCount - 데이타소스 내 items 의 수를 돌려준다. 



이 세 함수가 호출되어지는 법

우리가 비어있는 RecyclerView를 가지고 있고 데이타소스로는 성과 이름의 내용을 포함하고 있는 이름객체의 배열이 있다고 가정한다. 

RecyclerView가 놓여지고 그려질 때, 처음에 adapter에가 items의 수를 요청하고 이를 display한다. 아마 여러차례 요청할 수 있다. layout process가 수행되는 동안에.


그래서, 이 과정이 처음 수행되는게 중요하다.

RecyclerView가 Adapter에가 ViewHolder objects를 생성하라고 요청할 것이고 수행중에, onCreateViewHolder를 호출함으로써 다음 XML로 부터 개별 item views 를 올릴것이다.

이는 모든 items들을 display하거나 스크린을 채우고 스크롤할 만큼의 많은 ViewHolders를 생성할 것이다. 뭐든 옵션은 더 적은 ViewHolders를 요구하는 것이다.


onCreateViewHolder 함수는 views를 생성하고, code내에서 item views를 생성하거나, xml로 부터 item views를 올린다. 그리고, 새로운 view와 연관된 새로운 ViewHolder 객체를 돌려준다. 


각 ViewHolder가 생성되어진 후, RecyclerView는 onBindViewHolder를 호출해서 각 item을 데이타와 덧붙히고, scroll할때, RecyclerView는 이들 ViewHolders를 재사용할 것이다. Adapter에게 새로운 데이타를 ViewHolders에 바인딩할 것인지 요구하면서.



OnCreateViewHolder - create the views.

                                     inflates the item views from XML

                                     create them in code

                                     returns a new ViewHolder object


Adapter - create new items

                populate the items with data

                returns information




Layout Manager --------> RecyclerView<------------------Adapter <----------datasource

                                                                      ViewHolders



The adapter does create ViewHolder objects and inflates item views in its onCreateViewHolder function, it also returns the number of items in the data source, and binds data from the data source to each item (even if we pass the responsibility to the ViewHolder). It doesn't cache views associated with each item (that's the job of the ViewHolder class) nor does it recycle them; that’s what our RecyclerView does.


'IT study > android' 카테고리의 다른 글

coursera - introduction to the android platform  (0) 2018.03.27
Preference  (0) 2018.03.18
Lifecycle  (0) 2018.03.17
Intents  (0) 2018.03.16
Content Provider  (0) 2018.03.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함