2017-11-23 4 views
1

나는 recyclerView, ItemA 및 ItemB로 혼합하고 일치시키려는 두 개의 클래스가 있습니다. 이렇게하기 위해 BaseItem의 기본 클래스를 하나의 List로 전달할 수 있도록했습니다. 그런 다음 RecyclerAdapter의 getItemViewType 메소드에서 올바른 Viewholder를 사용할 수 있도록 클래스가 작동합니다.RecyclerView 목록 항목을 처리 할 때 상속을 사용하는 것이 안티 패턴입니까?

이 시점에서 내 내부 안티 패턴 본능이 커지기 시작했습니다. 일반적으로 객체를 처리하는 구체적인 클래스가 무엇인지 알아 내야한다면 기본 클래스가 없어야합니다. 이 일을하는 것은 잘못된 길입니까? 비슷한 일을하는 사람들의 예를 찾을 수 없었습니다.

좋은 대안이 있습니까? 내 요점을 설명하기 위해 몇 가지 코드를 조합했습니다.

public class ItemRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder> { 

    private FragmentManager fragmentManager; 

    private static final int TYPE_A = 0; 
    private static final int TYPE_B = 1; 

    private final LayoutInflater inflater; 
    private List<BaseItem> items; 

    public ItemRecyclerAdapter(Context context, List<BaseItem> items, FragmentManager fragmentManager) { 

     this.fragmentManager = fragmentManager; 
     inflater = LayoutInflater.from(context); 
     this.items = items; 
    } 

    @Override 
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     switch (viewType) { 

      case TYPE_A: 

       ViewGroup v = // Get viewGroup 
       ViewHolderA viewHolderA = new ViewHolderA(v); 
       return viewHolderA; 

      default: 

       ViewGroup defaultViewGroup = // Get viewGroup 
       ViewHolderB viewHolderB = new ViewHolderB(defaultViewGroup); 
       return viewHolderB; 
     } 
    } 

    @Override 
    public void onBindViewHolder(BaseViewHolder holder, int position) { 
     BaseMenuItem item = items.get(position); 

     switch (holder.getItemViewType()) { 


      case TYPE_A: 

       ViewHolderA va = (ViewHolderA) holder; 
       ViewHolderA.setData((ItemA) item); 

       break; 

      case TYPE_B: 

       ViewHolderB vb = (ViewHolderB) holder; 
       ViewHolderB.setData((ItemB) item); 

       break; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     BaseMenuItem item = items.get(position); 

     boolean IsItemTypeA = item.getClass() == ItemA.class; 
     if (IsItemTypeA) { 
      return TYPE_A; 
     } 

     return TYPE_B; 

    } 

    @Override 
    public int getItemCount() { 
     if (items == null) { 
      return 0; 
     } 

     return items.size(); 
    } 

    public abstract class BaseViewHolder extends RecyclerView.ViewHolder { 
     public BaseViewHolder(View itemView) { 
      super(itemView); 
     } 
    } 

    private class ViewHolderA extends BaseViewHolder { 
     // ViewHolder stuff here. 
    } 

    private class ViewHolderB extends BaseViewHolder { 
     // ViewHolder stuff here. 
    } 
} 
+0

체크 아웃 liskov 대체 원리를 통과 – unional

답변

1

저는 개인적으로 그것을 안티 패턴으로 생각하지 않습니다. 이러한 시나리오의 경우 Ive는 this 기사 (강의 권장)의 아이디어에서 수정 된 대리자 어댑터라는 패턴을 구현했습니다.

  • 의보기 유형을 선언 BaseItem에 추상적 인 방법을 지정하고, 아이들이 말했다 메소드를 구현하자

    나는 당신의 현재 구현에 일부 수정이 있지만 권장합니까. 뭔가 getViewType 그런 식으로하면 더러운 getClass 비교를 피할 수 있습니다.

  • 등록 된보기 유형을 유틸리티 클래스 또는 더 명확한 코드를위한 IntDef 정의에 저장하십시오.
1

M 개인적인 의견은,이 두 모델은 더 논리적 관계가없는 경우에 따라서 어떤 공통 속성을 공유하지 않는, 안티 패턴을 간주됩니다, 또는 추상화로 표현 될 수 없다는 것입니다.

유일한 목표는 두 모델을 포함하는 목록을 전달하는 경우 List<Object>