/**
* Adapter基类.
* 适用于只有单个Item的RecyclerView.
*
* Created by lypeer on 16-5-24.
*/
public abstract class BaseAdapter<V> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
/**
* 装载了每个Item的Value的列表
*/
private List<V> mValueList;
/**
* 我写的一个接口,通过回调分发点击事件
*/
private OnItemClickListener<V> mOnItemClickListener;
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return createViewHolder(parent.getContext(), parent);
}
@Override
@SuppressWarnings("unchecked")//一定会是BaseViewHolder的子类,因为createViewHolder()的返回值
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//BaseViewHolder是我抽象出来的RecyclerView.ViewHolder的基类,下面会有详细讲解
((BaseViewHolder) holder).setData(mValueList.get(position), position, mOnItemClickListener);
}
/**
* 设置每个Item的点击事件
* @param listener
*/
public void setOnClickListener(OnItemClickListener<V> listener) {
this.mOnItemClickListener = listener;
}
/**
* 刷新数据
* @param valueList 新的数据列表
*/
public void refreshData(List<V> valueList) {
this.mValueList = valueList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
return mValueList == null ? 0 : mValueList.size();
}
/**
* 生成ViewHolder
* @param context
* @param parent
* @return
*/
protected abstract BaseViewHolder createViewHolder(Context context, ViewGroup parent);
}
/**
* 点击事件的接口
* Created by lypeer on 16-5-24.
*/
public interface OnItemClickListener<V> {
/**
* 当item被点击的时候进行事件分发
*
* @param itemValue 点击的item传递的值
* @param viewID 点击控件的id
* @param position 被点击的item的位置
*/
void onItemClick(V itemValue, int viewID, int position);
}
public class SampleAdapter extends BaseAdapter<String> {
@Override
protected BaseViewHolder createViewHolder(Context context, ViewGroup parent) {
//SampleViewHolder继承自BaseViewHolder
return new SampleViewHolder(context, parent);
}
}
/**
* ViewHolder基类
*
* Created by lypeer on 16-5-27.
*/
public abstract class BaseViewHolder<V> extends RecyclerView.ViewHolder {
public BaseViewHolder(Context context, ViewGroup root, int layoutRes) {
super(LayoutInflater.from(context).inflate(layoutRes, root, false));
//这里使用了ButterKnife来进行控件的绑定
ButterKnife.bind(this, itemView);
}
/**
* 方便其子类进行一些需要Context的操作.
*
* @return 调用者的Context
*/
public Context getContext() {
return itemView.getContext();
}
/**
* 抽象方法,绑定数据.
* 让子类自行对数据和view进行绑定
*
* @param itemValue Item的数据
* @param position 当前item的position
* @param listener 点击事件监听者
*/
protected abstract void bindData(V itemValue, int position, OnItemClickListener listener);
/**
* 用于传递数据和信息
*
* @param itemValue
* @param position
* @param listener
*/
public void setData(V itemValue, int position, OnItemClickListener listener) {
bindData(itemValue, position, listener);
}
}
public class SampleViewHolder extends BaseViewHolder<String> {
//一个普通的可点击的TextView
@Bind(R.id.is_tv_content)
TextView mIsTvContent;
public SampleViewHolder(Context context, ViewGroup root) {
//修改了构造方法,在这里显式指定Layout ID
super(context, root, R.layout.item_sample);
}
@Override
protected void bindData(final String itemValue, final int position, final OnItemClickListener listener) {
//在这里完成控件的初始化,将其与数据绑定
if (itemValue != null) {
mIsTvContent.setText(itemValue);
}
//如果需要有点击事件,就通过listener把它传递出去
mIsTvContent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//如果外界没有调用BaseAdapter.setOnClickListener(),
//listener就为null
if(listener == null){
return;
}
//listener不为null就将这个事件传递给外界处理
listener.onItemClick(itemValue , v.getId() , position);
}
});
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有