package com.lcodecore.twinklingrefreshlayout.adapter.base; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.DecelerateInterpolator; import com.lcodecore.twinklingrefreshlayout.utils.DensityUtil; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; /** * RecyclerView适配器基类 */ public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements CommonHolder.OnNotifyChangeListener { private List<T> dataList = new ArrayList<>(); private boolean enableHead = false; CommonHolder headHolder; ViewGroup rootView; public final static int TYPE_HEAD = 0; public static final int TYPE_CONTENT = 1; @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int position) { rootView = parent; //设置ViewHolder int type = getItemViewType(position); if (type == TYPE_HEAD) { return headHolder; } else { return setViewHolder(parent); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // runEnterAnimation(holder.itemView, position); //数据绑定 if (enableHead) { if (position == 0) { ((CommonHolder) holder).bindHeadData(); } else { ((CommonHolder) holder).bindData(dataList.get(position - 1)); } } else { ((CommonHolder) holder).bindData(dataList.get(position)); } ((CommonHolder) holder).setOnNotifyChangeListener(this); } public ViewGroup getRootView() { return rootView; } @Override public int getItemCount() { if (enableHead) { return dataList.size() + 1; } return dataList.size(); } @Override public int getItemViewType(int position) { if (enableHead) { if (position == 0) { return TYPE_HEAD; } else { return TYPE_CONTENT; } } else { return TYPE_CONTENT; } } private int lastAnimatedPosition = -1; protected boolean animationsLocked = false; private boolean delayEnterAnimation = true; private void runEnterAnimation(View view, int position) { if (animationsLocked) return; if (position > lastAnimatedPosition) { lastAnimatedPosition = position; view.setTranslationY(DensityUtil.dip2px(view.getContext(), 100));//(position+1)*50f view.setAlpha(0.f); view.animate() .translationY(0).alpha(1.f) .setStartDelay(delayEnterAnimation ? 20 * (position) : 0) .setInterpolator(new DecelerateInterpolator(2.f)) .setDuration(500) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { animationsLocked = true; } }).start(); } } @Override public void onNotify() { //提供给CommonHolder方便刷新视图 notifyDataSetChanged(); } public void setDataList(List<T> datas) { dataList.clear(); if (null != datas) { dataList.addAll(datas); } notifyDataSetChanged(); } public void clearDatas() { dataList.clear(); notifyDataSetChanged(); } /** * 添加数据到前面 */ public void addItemsAtFront(List<T> datas) { if (null == datas) return; dataList.addAll(0, datas); notifyDataSetChanged(); } /** * 添加数据到尾部 */ public void addItems(List<T> datas) { if (null == datas) return; dataList.addAll(datas); notifyDataSetChanged(); } /** * 添加单条数据 */ public void addItem(T data) { if (null == data) return; dataList.add(data); notifyDataSetChanged(); } /** * 删除单条数据 */ public void deletItem(T data) { dataList.remove(data); Log.d("deletItem: ", dataList.remove(data) + ""); notifyDataSetChanged(); } /** * 设置是否显示head * * @param ifEnable 是否显示头部 */ public void setEnableHead(boolean ifEnable) { enableHead = ifEnable; } public void setHeadHolder(CommonHolder headHolder1) { enableHead = true; headHolder = headHolder1; } public void setHeadHolder(View itemView) { enableHead = true; headHolder = new HeadHolder(itemView); notifyItemInserted(0); } public CommonHolder getHeadHolder() { return headHolder; } /** * 子类重写实现自定义ViewHolder */ public abstract CommonHolder<T> setViewHolder(ViewGroup parent); public class HeadHolder extends CommonHolder<Void> { public HeadHolder(View itemView) { super(itemView); } public HeadHolder(Context context, ViewGroup root, int layoutRes) { super(context,root,layoutRes); } @Override public void bindData(Void aVoid) {//不用实现 } } }