145 lines
3.8 KiB
Java
145 lines
3.8 KiB
Java
package com.pukka.jiecheng.base;
|
|
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.recyclerview.widget.RecyclerView;
|
|
|
|
import java.util.List;
|
|
|
|
/**
|
|
* @author MajorLL
|
|
*/
|
|
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<BaseRecyclerViewHolder<T>> {
|
|
/**
|
|
* 源数据
|
|
*/
|
|
protected List<T> mData;
|
|
/**
|
|
* item 点击事件
|
|
*/
|
|
protected BaseOnItemClickListener<T> onItemClickListener = null;
|
|
|
|
/**
|
|
* item 焦点变化事件
|
|
*/
|
|
protected BaseOnItemFocusChangeListener<T> onItemFocusChangeListener = null;
|
|
|
|
|
|
/**
|
|
* 获取当前布局资源文件ID
|
|
*
|
|
* @param viewType viewType类型
|
|
* @return 返回资源ID
|
|
*/
|
|
protected abstract int getLayoutId(int viewType);
|
|
|
|
/**
|
|
* 获取对应ViewHolder
|
|
*
|
|
* @param view
|
|
* @param viewType
|
|
* @return
|
|
*/
|
|
public abstract BaseRecyclerViewHolder<T> getViewHolder(View view, int viewType);
|
|
|
|
public BaseRecyclerAdapter(@NonNull List<T> mData) {
|
|
this.mData = mData;
|
|
}
|
|
|
|
/**
|
|
* 获取对应位置泛型数据对象
|
|
*
|
|
* @param position 位置
|
|
* @return 泛型数据
|
|
*/
|
|
protected T getIndexData(int position) {
|
|
if (mData == null || mData.size() <= position) {
|
|
return null;
|
|
}
|
|
return mData.get(position);
|
|
}
|
|
|
|
@NonNull
|
|
@Override
|
|
public BaseRecyclerViewHolder<T> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
|
View view = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
|
|
return getViewHolder(view, viewType);
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(@NonNull BaseRecyclerViewHolder<T> holder, int position) {
|
|
holder.setData(getIndexData(position));
|
|
final int index = position;
|
|
holder.itemView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
holder.onItemClick(v, index, getIndexData(index));
|
|
if (onItemClickListener != null) {
|
|
onItemClickListener.onItemClick(v, index, getIndexData(index));
|
|
}
|
|
}
|
|
});
|
|
holder.itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
|
|
@Override
|
|
public void onFocusChange(View v, boolean hasFocus) {
|
|
holder.onItemFocusChange(v, hasFocus);
|
|
if (onItemFocusChangeListener != null) {
|
|
onItemFocusChangeListener.onItemFocusChange(v, hasFocus, index, getIndexData(index));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
if (mData == null) {
|
|
return 0;
|
|
}
|
|
return mData.size();
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取空页面数量
|
|
* @return 空页面数量
|
|
*/
|
|
public int getEmptyCount() {
|
|
if (mData == null) {
|
|
return 0;
|
|
}
|
|
int index = 0;
|
|
for (T mDatum : mData) {
|
|
if (mDatum == null) {
|
|
index++;
|
|
}
|
|
}
|
|
return index;
|
|
}
|
|
|
|
@Override
|
|
public int getItemViewType(int position) {
|
|
return super.getItemViewType(position);
|
|
}
|
|
|
|
/**
|
|
* 设置对应得Item点击事件
|
|
*
|
|
* @param onItemClickListener item点击事件回调
|
|
*/
|
|
public void setOnItemClickListener(BaseOnItemClickListener<T> onItemClickListener) {
|
|
this.onItemClickListener = onItemClickListener;
|
|
}
|
|
|
|
/**
|
|
* 设置对应item焦点事件
|
|
*
|
|
* @param onItemFocusChangeListener item焦点事件回调
|
|
*/
|
|
public void setOnItemFocusChangeListener(BaseOnItemFocusChangeListener<T> onItemFocusChangeListener) {
|
|
this.onItemFocusChangeListener = onItemFocusChangeListener;
|
|
}
|
|
}
|