// Path: library/src/main/java/com/freelib/multiitem/item/ItemData.java
// public interface ItemData {
// 
//     /**
//      * {@link View#setVisibility(int)}
//      *
//      * @param visibility @Visibility
//      */
//     void setVisibility(int visibility);
// 
//     /**
//      * {@link View#getVisibility()}
//      *
//      * @return @Visibility
//      */
//     int getVisibility();
// }


import android.databinding.DataBindingUtil;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.freelib.multiitem.item.ItemData;
package com.freelib.multiitem.adapter.holder;



/**
 * ViewHolder的管理类
 * 需要继承此类，实现ViewHolder的创建{@link #onCreateViewHolder}与绑定{@link #onBindViewHolder}
 *
 * @author free46000
 */
public abstract class ViewHolderManager<T, V extends BaseViewHolder> {
    private boolean fullSpan;
    private int spanSize;

    protected ViewModel viewModel = new BaseViewModel();

    /**
     * 创建ViewHolder
     * {@link android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder}
     */
    @NonNull
    public abstract V onCreateViewHolder(@NonNull ViewGroup parent);

    /**
     * 为ViewHolder绑定数据
     * {@link android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder}
     *
     * @param t 数据源
     */
    public abstract void onBindViewHolder(V holder, T t);

    /**
     * 为ViewHolder绑定数据，并根据params做出相应设置
     *
     * @param t      数据源
     * @param params {@link ViewHolderParams}
     */
    public void onBindViewHolder(@NonNull V holder, @NonNull T t, @NonNull ViewHolderParams params) {
        // TODO 如果以后有需要不直接在item view上设置Click事件，在MultiViewHolder增加itemHandlerView属性即可
        if (isClickable()) {
            holder.itemView.setOnClickListener(params.getClickListener());
            holder.itemView.setOnLongClickListener(params.getLongClickListener());
        }

        //如果数据源是ItemData，则执行定制化处理
// Path: library/src/main/java/com/freelib/multiitem/item/ItemData.java
// public interface ItemData {
// 
//     /**
//      * {@link View#setVisibility(int)}
//      *
//      * @param visibility @Visibility
//      */
//     void setVisibility(int visibility);
// 
//     /**
//      * {@link View#getVisibility()}
//      *
//      * @return @Visibility
//      */
//     int getVisibility();
// }


// Path: library/src/main/java/com/freelib/multiitem/adapter/holder/ViewHolderManager.java
import android.databinding.DataBindingUtil;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.freelib.multiitem.item.ItemData;

package com.freelib.multiitem.adapter.holder;



/**
 * ViewHolder的管理类
 * 需要继承此类，实现ViewHolder的创建{@link #onCreateViewHolder}与绑定{@link #onBindViewHolder}
 *
 * @author free46000
 */
public abstract class ViewHolderManager<T, V extends BaseViewHolder> {
    private boolean fullSpan;
    private int spanSize;

    protected ViewModel viewModel = new BaseViewModel();

    /**
     * 创建ViewHolder
     * {@link android.support.v7.widget.RecyclerView.Adapter#onCreateViewHolder}
     */
    @NonNull
    public abstract V onCreateViewHolder(@NonNull ViewGroup parent);

    /**
     * 为ViewHolder绑定数据
     * {@link android.support.v7.widget.RecyclerView.Adapter#onBindViewHolder}
     *
     * @param t 数据源
     */
    public abstract void onBindViewHolder(V holder, T t);

    /**
     * 为ViewHolder绑定数据，并根据params做出相应设置
     *
     * @param t      数据源
     * @param params {@link ViewHolderParams}
     */
    public void onBindViewHolder(@NonNull V holder, @NonNull T t, @NonNull ViewHolderParams params) {
        // TODO 如果以后有需要不直接在item view上设置Click事件，在MultiViewHolder增加itemHandlerView属性即可
        if (isClickable()) {
            holder.itemView.setOnClickListener(params.getClickListener());
            holder.itemView.setOnLongClickListener(params.getLongClickListener());
        }

        //如果数据源是ItemData，则执行定制化处理
        if (t instanceof ItemData) {