1

두 줄에 GridLayoutManager가있는 recyclerView를 만들고 나머지 요소보다 큰 첫 번째 요소를 만들어야합니다. 결과는 다음과 같아야합니다. enter image description hereGridLayoutManager 및 다른 viewHolder가있는 첫 번째 요소가있는 RecyclerView

나는 이것을 달성 할 수 있었지만 틀에 얽매이지 않았습니다. 내 recyclerView 어댑터에서는 첫 번째 요소에 대해 다른 viewHolder를 사용합니다. 그것은 훌륭한 해결책이었을 것입니다. 그러나 두 번째 요소는 첫 번째 요소 아래로 갔을 것입니다. 그래서 저는 recyclerView에 첫 번째 요소와 동일한 고정 높이를 부여하는 트릭을 만들었습니다. 첫 번째 요소와 두 번째 요소가 겹칠 것이고 두 번째 요소의 가시성을 사라지게 할 것입니다.

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case 0: 
      final View view = inflater.inflate(R.layout.big_item, parent, false); 
      return new BigViewHolder(view); 
     case 2: 
      final View view2 = inflater.inflate(R.layout.normal_item, parent, false); 
      return new NormalViewHolder(view2); 
     default: 
      return null; 
    } 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (position == 1) { 
     holder.itemView.setVisibility(View.GONE); 
    }} 

@Override 
public int getItemViewType(int position) { 
    if (position == 0) { 
     return 0; 
    } else return 2; 
} 

하지만이 방법은 특히 좋지 않습니다. 누구든지 이것에 대해 더 좋은 생각을 갖고 있습니까?

+0

['GridLayoutManager.SpanSizeLookup'] (https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager.SpanSizeLookup.html). 첫 번째 항목에는 2의 스팬을 반환하고 나머지 항목에는 1의 스팬을 반환 할 수 있습니다. –

+0

@MikeM. 제가 어떻게이 일을 성취 할 수 있는지 보여 주시겠습니까? setSpanSizeAtPosition() 메서드 또는 비슷한 것을 찾을 수 없습니다. 감사합니다 – Phantom

+0

오, 예, 죄송합니다, 방법을 지정하는 것을 잊었습니다. 'SpanSizeLookup'의 서브 클래스를 생성하고'getSpanSize (int position)'메소드를'position == 0 '을'return 2;'로, 나머지는'return 1;'으로 오버라이드합니다. 그런 다음 당신은'GridLayoutManager'에 그것의 인스턴스를 설정합니다. 'OnClickListener'와 같이 익명으로 할 수 있습니다. 빠른 예 : https://drive.google.com/file/d/1K3HCdetp0M8vT8M55pOO0pr7aMWZHyjJ/view?usp=drivesdk. –

답변

3

일부 파고 및 상담 후, 나는 꽤 좋은 결과를 얻었습니다. 내가 아래에 게시 할 예정입니다 : 내가 질문에서 언급 한 것처럼

먼저, 어댑터가 보일 것입니다, 두 번째 요소의 숨김없이 :

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    public static final int TYPE_FIRST_ITEM = 0; 
    public static final int TYPE_ITEM = 1; 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case TYPE_FIRST_ITEM: 
       final View view = inflater.inflate(R.layout.big_item, parent, false); 
       return new BigViewHolder(view); 
      case TYPE_ITEM: 
       final View view2 = inflater.inflate(R.layout.normal_item, parent, false); 
       return new NormalViewHolder(view2); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     switch (holder.getItemViewType()) { 
      case TYPE_FIRST_ITEM: 
       BigViewHolder bigViewHolder = (BigViewHolder) holder; 
       // Do what you need for the first item 
       break; 
      case TYPE_ITEM: 
       NormalViewHolder normalViewHolder = (NormalViewHolder) holder; 
       // Do what you for the other items 
       break; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == 0) { 
      return TYPE_FIRST_ITEM; 
     } else return TYPE_ITEM; 
    } 

    final class NormalViewHolder extends RecyclerView.ViewHolder { 
     public NormalViewHolder(View itemView) { 
      super(itemView); 
     } 
     // find your views here 
    } 

    final class BigViewHolder extends RecyclerView.ViewHolder { 
     public BigViewHolder(View itemView) { 
      super(itemView); 
     } 
     // find your views here 
    } 
} 

둘째, 레이아웃 매니저는 방법을 지정하는 리스너를 구현해야합니다 여러 행 (특정 행)은 특정 위치에 있어야합니다.

RecyclerView mRecyclerView = view.findViewById(R.id.my_recycler_view); 
     MyAdapter mAdapter = new MyAdapter(); 
     GridLayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2, LinearLayoutManager.HORIZONTAL, false); 
     mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_FIRST_ITEM: 
         return 2; 
        case MyAdapter.TYPE_ITEM: 
         return 1; 
        default: 
         return -1; 
       } 
      } 
     }); 
     mRecyclerView.setAdapter(mAdapter); 
     mRecyclerView.setLayoutManager(mLayoutManager); 

다른 사람에게 도움이되기를 바랍니다. 도움을 주신 Mike M.에 감사드립니다.