나는 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.
}
}
체크 아웃 liskov 대체 원리를 통과 – unional