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); 
 | 
} 
 |