| package com.doumee.lib_coremodel.view.recyclerview.adapter; | 
|   | 
| import android.content.Context; | 
| import android.view.LayoutInflater; | 
| import android.view.View; | 
| import android.view.ViewGroup; | 
|   | 
| import androidx.annotation.LayoutRes; | 
| import androidx.recyclerview.widget.AsyncListDiffer; | 
| import androidx.recyclerview.widget.DiffUtil; | 
| import androidx.recyclerview.widget.RecyclerView; | 
|   | 
| import com.king.base.adapter.HolderRecyclerAdapter; | 
| import com.king.base.adapter.holder.ViewHolder; | 
|   | 
| import java.util.List; | 
|   | 
| public abstract class DiffHolderRecyclerAdapter<T,H extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<H> implements ViewHolder.OnItemClick{ | 
|   | 
|     private Context context; | 
|     private AsyncListDiffer<T> mDiffer; | 
|   | 
|     private LayoutInflater layoutInflater; | 
|   | 
|     private HolderRecyclerAdapter.OnItemClickListener mOnItemClickListener; | 
|     private HolderRecyclerAdapter.OnItemChildClickListener mOnItemChildClickListener; | 
|   | 
|     public interface OnItemClickListener{ | 
|         void onItemClick(View v, int position); | 
|     } | 
|   | 
|     public void setOnItemClickListener(HolderRecyclerAdapter.OnItemClickListener clickListener){ | 
|         this.mOnItemClickListener = clickListener; | 
|     } | 
|   | 
|     protected void onItemClick(View v,int position){ | 
|         if(mOnItemClickListener!=null){ | 
|             mOnItemClickListener.onItemClick(v,position); | 
|         } | 
|     } | 
|   | 
|     public interface OnItemChildClickListener{ | 
|         void onItemChildClick(View v, int position); | 
|     } | 
|   | 
|     public void setOnItemChildClickListener(HolderRecyclerAdapter.OnItemChildClickListener clickListener){ | 
|         this.mOnItemChildClickListener = clickListener; | 
|     } | 
|   | 
|     @Override | 
|     public void onItemClick(View v,int position,boolean isChild){ | 
|         if(isChild){ | 
|             if(mOnItemChildClickListener!=null){ | 
|                 mOnItemChildClickListener.onItemChildClick(v,position); | 
|             } | 
|         }else{ | 
|             onItemClick(v,position); | 
|         } | 
|   | 
|     } | 
|   | 
|     public DiffHolderRecyclerAdapter(Context context, DiffUtil.ItemCallback<T> DIFF_CALLBACK){ | 
|         super(); | 
|         this.context = context; | 
|         this.mDiffer= new AsyncListDiffer(this, DIFF_CALLBACK); | 
|         this.layoutInflater = LayoutInflater.from(context); | 
|     } | 
|   | 
|     public LayoutInflater getLayoutInflater(){ | 
|         return layoutInflater; | 
|     } | 
|   | 
|     public Context getContext(){ | 
|         return context; | 
|     } | 
|   | 
|     @Override | 
|     public H onCreateViewHolder(ViewGroup parent, int viewType) { | 
|   | 
|         View itemView = buildConvertView(layoutInflater,parent,viewType); | 
|         return buildHolder(itemView,viewType); | 
|     } | 
|   | 
|     @Override | 
|     public void onBindViewHolder(H holder, final int position) { | 
|         T item = position<mDiffer.getCurrentList().size() ? mDiffer.getCurrentList().get(position) : null; | 
|   | 
|         bindViewDatas(holder,item,position); | 
|         if(this.mOnItemClickListener!=null){ | 
|             holder.itemView.setOnClickListener(new View.OnClickListener() { | 
|                 @Override | 
|                 public void onClick(View v) { | 
|                     onItemClick(v,position); | 
|                 } | 
|             }); | 
|         } | 
|   | 
|         if(holder instanceof ViewHolder){ | 
|             ((ViewHolder)holder).setItemClick(this); | 
|         } | 
|     } | 
|   | 
|     @Override | 
|     public int getItemCount() { | 
|         return (mDiffer==null||mDiffer.getCurrentList()==null) ? 0:mDiffer.getCurrentList().size(); | 
|     } | 
|   | 
|     public View inflate(@LayoutRes int layoutId, ViewGroup parent, boolean attachToRoot){ | 
|         return layoutInflater.inflate(layoutId,parent,attachToRoot); | 
|     } | 
|   | 
|     public List<T> getListData() { | 
|         return mDiffer.getCurrentList(); | 
|     } | 
|   | 
|     public void setListData(List<T> listData) { | 
|         this.mDiffer.submitList(listData); | 
|     } | 
|   | 
|     /** | 
|      * 建立convertView | 
|      * @param layoutInflater | 
|      * @param parent | 
|      * @param viewType | 
|      * @return | 
|      */ | 
|     public abstract View buildConvertView(LayoutInflater layoutInflater, ViewGroup parent, int viewType); | 
|   | 
|     /** | 
|      * 建立视图Holder | 
|      * @param convertView | 
|      * @param viewType | 
|      * @return | 
|      */ | 
|     public abstract H buildHolder(View convertView,int viewType); | 
|   | 
|     /** | 
|      * 绑定数据 | 
|      * @param holder | 
|      * @param item | 
|      * @param position | 
|      */ | 
|     public abstract void bindViewDatas(H holder,T item,int position); | 
| } |