/* * Copyright (C) 2014 Ribot Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package uk.co.ribot.easyadapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * Abstract extension of {@link android.support.v7.widget.RecyclerView.Adapter} that allows you to use * {@link uk.co.ribot.easyadapter.ItemViewHolder} in a {@link android.support.v7.widget.RecyclerView}. * You should extend this class if your Adapter requires a data structure different to a List or it needs to provide some extra functionality * to handle the data, i.e if you need a method to add items at the beginning of the list. * If not simply use the provided implementation {@link uk.co.ribot.easyadapter.EasyRecyclerAdapter} * * @param <T> Data type for items */ public abstract class BaseEasyRecyclerAdapter<T> extends RecyclerView.Adapter<BaseEasyRecyclerAdapter.RecyclerViewHolder> { private Class mItemViewHolderClass; private LayoutInflater mInflater; private Integer mItemLayoutId; private Object mListener; /** * Constructs a BaseEasyRecyclerAdapter with a Context and an {@link ItemViewHolder} class. * * @param context a valid Context * @param itemViewHolderClass your {@link ItemViewHolder} implementation class */ public BaseEasyRecyclerAdapter(Context context, Class<? extends ItemViewHolder> itemViewHolderClass) { init(context, itemViewHolderClass); } /** * Constructs a BaseEasyRecyclerAdapter with a Context, an {@link ItemViewHolder} class and a generic listener. * * @param context a valid Context * @param itemViewHolderClass your {@link ItemViewHolder} implementation class * @param listener a generic object that you can access from your {@link ItemViewHolder} by calling * {@link ItemViewHolder#getListener()}, This can be used to pass a listener to the view holder that then you * can cast and use as a callback. */ public BaseEasyRecyclerAdapter(Context context, Class<? extends ItemViewHolder> itemViewHolderClass, Object listener) { init(context, itemViewHolderClass); mListener = listener; } private void init(Context context, Class<? extends ItemViewHolder> itemViewHolderClass) { mItemViewHolderClass = itemViewHolderClass; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mItemLayoutId = EasyAdapterUtil.parseItemLayoutId(itemViewHolderClass); } public abstract T getItem(int position); @Override public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int i) { View itemView = mInflater.inflate(mItemLayoutId, parent, false); ItemViewHolder<T> itemViewHolder = EasyAdapterUtil.createViewHolder(itemView, mItemViewHolderClass); itemViewHolder.setListener(mListener); itemViewHolder.onSetListeners(); return new RecyclerViewHolder(itemViewHolder); } @Override public void onBindViewHolder(RecyclerViewHolder recyclerViewHolder, int position) { T item = getItem(position); ItemViewHolder<T> itemViewHolder = recyclerViewHolder.itemViewHolder; PositionInfo positionInfo = new PositionInfo(position, position == 0, position == getItemCount() - 1); itemViewHolder.setItem(item); itemViewHolder.onSetValues(item, positionInfo); } // A RecyclerView.ViewHolder that wraps an ItemViewHolder static class RecyclerViewHolder extends RecyclerView.ViewHolder { ItemViewHolder itemViewHolder; public RecyclerViewHolder(ItemViewHolder itemViewHolder) { super(itemViewHolder.getView()); this.itemViewHolder = itemViewHolder; } } }