package com.sina.weibo.simple.app;
import android.view.View;
import android.view.ViewGroup;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import rx.functions.*;
public class ListRecyclerAdapter<T, VH extends BindViewHolder<T>> extends RecyclerView.Adapter<VH> {
private List<T> mList = Collections.emptyList();
protected Action3<VH, Integer, T> mOnBindViewHolder;
protected Func2<ViewGroup, Integer, VH> mOnCreateViewHolder;
public ListRecyclerAdapter(List<T> list) {
mList = list;
}
public static <R, VHH extends BindViewHolder<R>> ListRecyclerAdapter<R, VHH> create() {
return create(new ArrayList<R>());
}
public static <R, VHH extends BindViewHolder<R>> ListRecyclerAdapter<R, VHH> create(List<R> list) {
return new ListRecyclerAdapter<>(list);
}
@Override
public VH onCreateViewHolder(ViewGroup parent, int viewType) {
if (mOnCreateViewHolder != null) return mOnCreateViewHolder.call(parent, viewType);
return null;
}
protected ListRecyclerAdapter<T, VH> createViewHolder(Func2<ViewGroup, Integer, VH> onCreateViewHolder) {
mOnCreateViewHolder = onCreateViewHolder;
return this;
}
private boolean onBindViewHolderSupered;
@Override
public void onBindViewHolder(VH viewHolder, int position) { // final, DO NOT Override until certainly
onBindViewHolderSupered = false;
onBindViewHolder(viewHolder, position, mList.get(position));
if (!onBindViewHolderSupered) throw new IllegalArgumentException("super.onBindViewHolder() not be called");
}
// super me
public void onBindViewHolder(VH viewHolder, int position, T item) { // final, DO NOT Override until certainly
onBindViewHolderSupered = true;
if (mOnBindViewHolder == null) {
mOnBindViewHolder = new Action3<VH, Integer, T>() {
@Override
public void call(VH vh, Integer i, T t) {
vh.onBind(i, t);
}
};
}
mOnBindViewHolder.call(viewHolder, position, item);
}
public ListRecyclerAdapter<T, VH> bindViewHolder(Action3<VH, Integer, T> onBindViewHolder) {
mOnBindViewHolder = onBindViewHolder;
return this;
}
@Override
public int getItemCount() {
int i = mList.size();
return i;
}
public List<T> getList() {
return mList;
}
}