2017-11-12 5 views
0

현재 RecycleView 용 사용자 정의 다중보기 유형을 작업하고 있습니다. 이 문제에 대한 여러 가지 해결책을 찾았지만 제 길을 나눌 것입니다.RecycleView의 다중보기 유형을 구현하는 방법은 무엇입니까?

다른 것은 ViewType 정의에 enum을 사용합니다.

자세한 내용은 내 대답을 참조하십시오. (그냥 공유하고 싶음).

+0

[Recyclerview 및 다른 종류의 행 인플레이션 처리 가능]의 복제본 (https://stackoverflow.com/questions/25914003/recyclerview-and-handling-different-type-of-row-inflation) –

답변

2

이 글을 읽을 것을 권장합니다

UPDATE : 여기


Writing Better Adapter 길 RecyclewView에 대한 I 맞춤형 멀티 뷰 유형이다.

먼저 코드를 표시하고 다음 설명을 보여줍니다.

  1. 어댑터의 데이터 &가 Wrapper 클래스에서 확장 일반적이다 : 당신은 어댑터를 볼 수 있습니다

    @SuppressWarnings("unchecked") 
    public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> { 
        private final List<Wrapper<?>> items; 
    
        public BaseAdapter() { 
         this.items = new ArrayList<>(); 
        } 
    
        @Override 
        public int getItemViewType(int position) { 
         return items.get(position).viewType; 
        } 
    
        @Override 
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
         return ViewType.values()[viewType].onCreateViewHolder(parent); 
        } 
    
        @Override 
        public void onBindViewHolder(ViewHolder holder, int position) { 
         holder.onBind(items.get(position)); 
        } 
    
        @Override 
        public int getItemCount() { 
         return items.size(); 
        } 
    
    
        public void simulateAddItems() { 
         items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User())); 
         items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User())); 
         items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User())); 
         items.add(new Wrapper<>(ViewType.BOTTOM.viewTYpe(), new BottomData())); 
    
         notifyDataSetChanged(); 
        } 
    
        public enum ViewType { 
         USER { 
          @Override 
          public ViewHolder onCreateViewHolder(ViewGroup parent) { 
           return new UserViewHolder(itemView); 
          } 
         }, 
         BOTTOM { 
          @Override 
          public ViewHolder onCreateViewHolder(ViewGroup parent) { 
           return new BottomViewHolder(itemView); 
          } 
         }; 
    
         public abstract ViewHolder onCreateViewHolder(ViewGroup parent); 
    
         public int viewTYpe() { 
          return ordinal(); 
         } 
        } 
    
    
        static class Wrapper<T> { 
         final int viewType; 
         final T data; 
    
         public Wrapper(int viewType, T data) { 
          this.viewType = viewType; 
          this.data = data; 
         } 
        } 
    
        public static class ViewHolder<T> extends RecyclerView.ViewHolder { 
         private T item; 
    
         public ViewHolder(View itemView) { 
          super(itemView); 
         } 
    
    
         public void onBind(T item) { 
         } 
        } 
    
        public static class UserViewHolder extends ViewHolder<User> { 
    
         public UserViewHolder(View itemView) { 
          super(itemView); 
         } 
    
         @Override 
         public void onBind(User item) { 
          super.onBind(item); 
         } 
        } 
    
        public static class BottomViewHolder extends ViewHolder<BottomData> { 
    
         public BottomViewHolder(View itemView) { 
          super(itemView); 
         } 
    
         @Override 
         public void onBind(BottomData item) { 
          super.onBind(item); 
         } 
        } 
    
    
        static class User { 
         // user fields & method 
        } 
    
        static class BottomData { 
         // bottom data fields & method 
        } 
    } 
    

    은 특별한 무언가가있다. Wrapper 클래스의 POJO 클래스는 두 개의 필드 viewType & item 데이터를 포함합니다. viewTypegetItemViewType(int position)을 통과하고 item은 각보기 소유자의 데이터입니다.

  2. 일반 ViewHolder (T)은보기 소유자의 데이터 종류입니다. 두 개의 사용자 지정보기 소유자 UserViewHolderBottomViewHolderViewHolder에서이 데이터로 확장 된 것을 볼 수 있습니다. (따라서 각 뷰 홀더의 onBind에는 정확한 데이터가 필요합니다.> 캐스팅 할 필요가 없습니다. 이미 캐스팅되어 있기 때문에).

  3. enum ViewType에는 모든보기 유형의 어댑터가 들어 있습니다. 또한 뷰 유형에서 우리는 ViewHolder onCreateViewHolder(ViewGroup parent) 메서드를 사용하므로 viewHolder를 ViewType에서 쉽게 만들 수 있습니다. ViewType을 기준으로 Holder를 보는 것이 우리 눈에 더 쉽다고 생각합니다.

는 또한, 우리는 단순히 열거의 ordinal()을 반환 viewType() 방법이있다. 참조로 java docs 해당 방법을 사용할 수 없습니다. 그러나이 경우에는 (고유하기 때문에) 사용하는 것이 충분히 공정하다고 생각합니다.

그래서 방법에 어댑터의 onCreateViewHolder 우리가 할 수있는 간단한 전화 : return ViewType.values()[viewType].onCreateViewHolder(parent);

onBindViewHolder 우리가 holder.onBind(items.get(position));를 호출합니다.

마지막으로 어댑터에 항목을 추가하는 방법을 데모 용으로 simulateAddItems을 만들었습니다.

다음은 RecycleView의 사용자 정의보기 유형으로 작업하는 동안의 경험입니다. 유용하다고 희망 & 다른 사람들을 돕기.