11

나는 순간 내가 RecyclerViewCardView 년대와 장난 해요에서RecyclerView는


을하고 싶습니다 무엇. 지금 나는 과 함께 ListView과 비슷한 다른 내용으로 동일한 CardView를 여러 번 표시 할 수있는 RecyclerView.Adapter을 작성했습니다.

이제 다른 CardView-Layout (Google Now 스타일)의 RecyclerView을 작성하고 싶습니다. 이미 자습서를 검색했지만 해당 주제에 대해 유용한 것을 찾지 못했습니다. 누군가가 이것을 어떻게 구현해야 하는지를 알고 있습니까? 그것을 실현하기 위해서는 무엇이 필요합니까?

+0

https://developer.android.com/training/material/lists-cards.html. 다른 레이아웃의 경우 어댑터의 ViewType을 변경하십시오. –

+0

@PedroOliveira 나는 이미 읽었지만, 하나의 카드로 처리 한 방법과 다른 것은 아닙니다. – safari

+0

어댑터에서'getItemViewType'을 오버라이드하고 다른 뷰 타입을 반환해야만합니다. 즉, onCreateViewHolder (뷰포트를 2º 매개 변수로받는)에 다른 레이아웃을 적용 할 수 있습니다. –

답변

16

원하는 것을 얻으려면 RecyclerView.AdaptergetItemViewType(position)을 무시해야합니다. int을 반환하면이 위치를 나타내는 데 어떤 종류의보기가 사용되는지 알려줍니다.

다음은 createViewHolder (parent,viewType)에 서로 다른 ViewHolders을 작성하며이 경우 각 CardLayout에 대한 참조가 유지됩니다.

다음으로 bindViewHolder(holder, position)에 스위치 문을 만들거나 가능한보기 목록을 검토하여 데이터로 채울 수 있습니다. 아래

샘플 코드 :

public GeneralViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 

    GeneralViewHolder holder; 
    View v; 
    Context context = viewGroup.getContext(); 

    if (viewType == FIRST_TYPE) { 
     v = LayoutInflater.from(context) 
       .inflate(R.layout.first_card, viewGroup, false); 

     holder = new FirstTypeViewHolder(v); //Of type GeneralViewHolder 
    } else { 
     v = LayoutInflater.from(context) 
       .inflate(R.layout.second_card, viewGroup, false); 
     holder = new SecondTypeViewHolder(v); 
    } 

    return holder; 
} 

public void onBindViewHolder(GeneralViewHolder viewHolder, int i) { 
    if(getItemViewType(i)==FIRST_TYPE) { 
     FirstTypeViewHolder holder1 = (FirstTypeViewHolder)viewHolder; 
    } else { 
     SecondTypeViewHolder holder1 = (SecondTypeViewHolder)viewHolder; 
    } 
} 

public int getItemViewType (int position) { 
    //Some logic to know which type will come next; 
    return Math.random()<0.5 ? FIRST_TYPE : SECOND_TYPE; 
} 
+0

정말 대단합니다. 시도해 보겠습니다. :-)! +1 – safari

관련 문제