美文网首页
RecyclerView GroupAdapter

RecyclerView GroupAdapter

作者: Ovadyah | 来源:发表于2019-08-09 19:15 被阅读0次

    Android RecyclerView 分组展示Adapter

    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.RecyclerView.ViewHolder;
    import android.view.ViewGroup;
    
    import java.util.List;
    
    /**
     * Adapter that will group other adapter.
     * <p/>
     * Created by dekalo on 03.09.15.
     */
    public class GroupAdapter extends RecyclerView.Adapter<ViewHolder> {
    
        private RecyclerView.Adapter<ViewHolder>[] adapters;
        private int maxViewType = 1000;
    
        /**
         * Mentioned adapter should have view types not more than 100.
         *
         * @param adapters
         */
        public GroupAdapter(RecyclerView.Adapter<ViewHolder>... adapters) {
            this.adapters = adapters;
            registerObserver();
        }
    
        public void setAdapters(RecyclerView.Adapter<ViewHolder>... adapters) {
            this.adapters = adapters;
            registerObserver();
            notifyDataSetChanged();
        }
    
        public void setMaxViewTypeValue(int maxViewType) {
            this.maxViewType = maxViewType;
        }
    
        private void registerObserver() {
            for (RecyclerView.Adapter<ViewHolder> adapter : adapters) {
                adapter.registerAdapterDataObserver(new LocalObserver());
            }
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int absolutePosition) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(absolutePosition);
            adapters[indexAndPosition[0]].onBindViewHolder(holder, indexAndPosition[1]);
        }
    
        @Override
        public void onViewRecycled(ViewHolder holder) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(holder.getAdapterPosition());
            adapters[indexAndPosition[0]].onViewRecycled(holder);
        }
    
        @Override
        public void onViewDetachedFromWindow(ViewHolder holder) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(holder.getAdapterPosition());
            adapters[indexAndPosition[0]].onViewDetachedFromWindow(holder);
        }
    
        @Override
        public boolean onFailedToRecycleView(ViewHolder holder) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(holder.getAdapterPosition());
            return adapters[indexAndPosition[0]].onFailedToRecycleView(holder);
        }
    
        @Override
        public void onViewAttachedToWindow(ViewHolder holder) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(holder.getAdapterPosition());
            adapters[indexAndPosition[0]].onViewAttachedToWindow(holder);
        }
    
        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            for (RecyclerView.Adapter adapter : adapters) {
                adapter.onAttachedToRecyclerView(recyclerView);
            }
        }
    
        @Override
        public void onBindViewHolder(ViewHolder holder, int position, List<Object> payloads) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(holder.getAdapterPosition());
            adapters[indexAndPosition[0]].onBindViewHolder(holder, indexAndPosition[1]);
        }
    
        @Override
        public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
            for (RecyclerView.Adapter adapter : adapters) {
                adapter.onDetachedFromRecyclerView(recyclerView);
            }
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            int relativeViewType = viewType % maxViewType;
            int adapterIndex = viewType / maxViewType;
            return adapters[adapterIndex].onCreateViewHolder(parent, relativeViewType);
        }
    
        @Override
        public int getItemViewType(int absolutePosition) {
            int[] indexAndPosition = getAdapterIndexAndRelativePosition(absolutePosition);
            return relativeViewTypeToAbsolute(indexAndPosition[0], adapters[indexAndPosition[0]].getItemViewType(indexAndPosition[1]));
        }
    
        private int relativeViewTypeToAbsolute(int adapterIndex, int relativeViewType) {
            if (relativeViewType > maxViewType || relativeViewType < 0) {
                throw new UnsupportedOperationException("Please use view type in range from specified in setMaxViewTypeValue(int), current value = " + maxViewType);
            }
            return maxViewType * adapterIndex + relativeViewType;
        }
    
        private int[] getAdapterIndexAndRelativePosition(int absolutePosition) {
            int relativePosition = absolutePosition;
            for (int i = 0; i < adapters.length; i++) {
                RecyclerView.Adapter adapter = adapters[i];
                if (adapter.getItemCount() > relativePosition) {
                    return new int[]{i, relativePosition};
                } else {
                    relativePosition -= adapter.getItemCount();
                }
            }
            throw new IllegalStateException("Unreachable " + absolutePosition);
        }
    
        @Override
        public int getItemCount() {
            int result = 0;
            for (RecyclerView.Adapter adapter : adapters) {
                result += adapter.getItemCount();
            }
            return result;
        }
    
        private class LocalObserver extends RecyclerView.AdapterDataObserver {
            @Override
            public void onChanged() {
                notifyDataSetChanged();
            }
    
            @Override
            public void onItemRangeRemoved(int positionStart, int itemCount) {
                notifyItemRangeRemoved(positionStart, itemCount);
            }
    
            @Override
            public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
                notifyItemMoved(fromPosition, toPosition);
            }
    
            @Override
            public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
                notifyItemRangeChanged(positionStart, itemCount, payload);
            }
    
            @Override
            public void onItemRangeChanged(int positionStart, int itemCount) {
                notifyItemRangeChanged(positionStart, itemCount);
            }
    
            @Override
            public void onItemRangeInserted(int positionStart, int itemCount) {
                notifyItemRangeInserted(positionStart, itemCount);
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:RecyclerView GroupAdapter

          本文链接:https://www.haomeiwen.com/subject/tbhkjctx.html