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.DiffUtil;
|
|
import com.king.base.adapter.holder.ViewHolder;
|
|
import java.lang.reflect.Constructor;
|
import java.lang.reflect.Modifier;
|
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.Type;
|
|
public abstract class DiffBaseRecyclerAdapter<T,H extends ViewHolder> extends DiffHolderRecyclerAdapter<T,H> {
|
|
private int layoutId;
|
|
public DiffBaseRecyclerAdapter(Context context, @LayoutRes int layoutId,DiffUtil.ItemCallback<T> DIFF_CALLBACK) {
|
super(context, DIFF_CALLBACK);
|
this.layoutId = layoutId;
|
}
|
|
@Override
|
public H buildHolder(View convertView, int viewType) {
|
return createViewHolder(convertView);
|
}
|
|
@Override
|
public View buildConvertView(LayoutInflater layoutInflater, ViewGroup parent, int viewType) {
|
return layoutInflater.inflate(layoutId,parent,false);
|
}
|
|
/**
|
* 创建ViewHolder
|
* @param view view
|
* @return new ViewHolder
|
*/
|
@SuppressWarnings("unchecked")
|
protected H createViewHolder(View view) {
|
Class temp = getClass();
|
Class z = null;
|
while (z == null && null != temp) {
|
z = getInstancedGenericHClass(temp);
|
temp = temp.getSuperclass();
|
}
|
H holder;
|
// 泛型擦除会导致z为null
|
if (z == null) {
|
holder = (H) new ViewHolder(view);
|
} else {
|
holder = createGenericHInstance(z, view);
|
}
|
return holder != null ? holder : (H) new ViewHolder(view);
|
}
|
|
/**
|
* 创建泛型{@link H}实例
|
* @param z
|
* @param view
|
* @return
|
*/
|
@SuppressWarnings("unchecked")
|
private H createGenericHInstance(Class z, View view) {
|
try {
|
Constructor constructor;
|
// 成员类和非静态类
|
if (z.isMemberClass() && !Modifier.isStatic(z.getModifiers())) {
|
constructor = z.getDeclaredConstructor(getClass(), View.class);
|
constructor.setAccessible(true);
|
return (H) constructor.newInstance(this, view);
|
} else {
|
constructor = z.getDeclaredConstructor(View.class);
|
constructor.setAccessible(true);
|
return (H) constructor.newInstance(view);
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return null;
|
}
|
|
/**
|
* 获取泛型{@link H}
|
*
|
* @param z
|
* @return
|
*/
|
private Class getInstancedGenericHClass(Class z) {
|
Type type = z.getGenericSuperclass();
|
if (type instanceof ParameterizedType) {
|
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
|
for (Type temp : types) {
|
if (temp instanceof Class) {
|
Class tempClass = (Class) temp;
|
if (ViewHolder.class.isAssignableFrom(tempClass)) {
|
return tempClass;
|
}
|
} else if (temp instanceof ParameterizedType) {
|
Type rawType = ((ParameterizedType) temp).getRawType();
|
if (rawType instanceof Class && ViewHolder.class.isAssignableFrom((Class<?>) rawType)) {
|
return (Class<?>) rawType;
|
}
|
}
|
}
|
}
|
return null;
|
}
|
|
}
|