2017-11-12 18 views
0

現在、私はRecycleViewのカスタムマルチビュータイプを扱っています。 この問題の解決策はたくさんありましたが、私は自分のやり方を分かち合います。RecycleViewのマルチビュータイプの実装方法は?

異なるのは、ビュータイプを定義するためにenumです。

詳細は私の答えをご覧ください。 (ちょうど共有したい)

+0

[Recyclerviewと異なる種類の行インフレーションの処理]の可能な複製(https://stackoverflow.com/questions/25914003/recyclerview-and-handling-different-type-ofrow-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 
        } 
    } 
    

    は、何か特別なものを持っています。単純にPOJOクラスのWrapperクラスには、2つのフィールドviewType & itemのデータが含まれています。 viewTypegetItemViewType(int position)を通過し、itemは各ビューホルダーのデータです。

  2. ViewHolderTは、ビューホルダーの種類のデータです。 2つのカスタムビューホルダー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のカスタム表示タイプを操作中のいくつかの経験があります。役に立つと嬉しいです&他の人を助けてください。

関連する問題