getData() {
return mDataList;
}
@Override
public long getItemId(int position) {
return position;
}
/**
* instead by{@link #getItemType(Object)}
*
* 通过数据得到obj的类型的type
* 然后,通过{@link ItemTypeUtil}来转换位int类型的type
*/
@Deprecated
@Override
public int getItemViewType(int position) {
this.currentPos = position;
mType = getItemType(mDataList.get(position));
return mUtil.getIntType(mType);
}
@Override
public Object getItemType(T t) {
return -1; // default
}
@Override
public RcvAdapterItem onCreateViewHolder(ViewGroup parent, int viewType) {
return new RcvAdapterItem(parent.getContext(), parent, createItem(mType));
}
@Override
public void onBindViewHolder(RcvAdapterItem holder, int position) {
holder.item.handleData(getConvertedData(mDataList.get(position), mType), position);
}
@NonNull
@Override
public Object getConvertedData(T data, Object type) {
return data;
}
@Override
public int getCurrentPosition() {
return currentPos;
}
///////////////////////////////////////////////////////////////////////////
// 内部用到的viewHold
///////////////////////////////////////////////////////////////////////////
public static class RcvAdapterItem extends RecyclerView.ViewHolder {
protected AdapterItem item;
boolean isNew = true; // debug中才用到
RcvAdapterItem(Context context, ViewGroup parent, AdapterItem item) {
super(LayoutInflater.from(context).inflate(item.getLayoutResId(), parent, false));
this.item = item;
this.item.bindViews(itemView);
this.item.setViews();
}
}
///////////////////////////////////////////////////////////////////////////
// For debug
///////////////////////////////////////////////////////////////////////////
private void debug(RcvAdapterItem holder) {
boolean debug = false;
if (debug) {
holder.itemView.setBackgroundColor(holder.isNew ? 0xffff0000 : 0xff00ff00);
holder.isNew = false;
}
}
}
================================================
FILE: base/src/main/java/com/ccj/base/adapter/bean/AdapterBean.java
================================================
package com.ccj.base.adapter.bean;
import java.io.Serializable;
/**
* 数据bean
* 为了不同viewItem 分别对应不同的bean,
* 避免不同item的字段都杂糅的同一个类中的情况,比如{ mobile中的 CommonRowsBean}
* 根据Holder建立一个新的bean, 自定义的bean要继承AdapterBean,在bean中添置所需字段,供holder调用,比如(mobile中 BrandRcvAdapter中的holder)
*
* Created by chenchangjun on 17/12/28.
*/
public abstract class AdapterBean implements Serializable {
//唯一标示!
public abstract void setCell_type(int cell_type);
public abstract int getCell_type();
}
================================================
FILE: base/src/main/java/com/ccj/base/adapter/bean/AdapterGroupBean.java
================================================
package com.ccj.base.adapter.bean;
import java.io.Serializable;
import java.util.List;
/**
* 类似于 view和 viewgroup 的概念 这里是 viewgroup
* Created by chenchangjun on 18/1/4.
*/
public abstract class AdapterGroupBean extends AdapterBean implements Serializable {
//唯一标示!
public abstract List getList();
public abstract String getTitle();
public abstract T getRedirect_data();
}
================================================
FILE: base/src/main/java/com/ccj/base/adapter/item/AdapterItem.java
================================================
package com.ccj.base.adapter.item;
import android.support.annotation.LayoutRes;
import android.view.View;
/**
* @author ccj
* @date 2017/3/21
*/
public interface AdapterItem {
/**
* @return item布局文件的layoutId
*/
@LayoutRes
int getLayoutResId();
/**
* 初始化views
*/
void bindViews(final View root);
/**
* 设置view的参数
* 设置监听等,只执行一次
*/
void setViews();
/**
* 根据数据来设置item的内部views
*
* @param t 数据list内部的model
* @param position 当前adapter调用item的位置
*/
void handleData(T t, int position);
}
================================================
FILE: base/src/main/java/com/ccj/base/adapter/util/IAdapter.java
================================================
package com.ccj.base.adapter.util;
import android.support.annotation.Keep;
import android.support.annotation.NonNull;
import com.ccj.base.adapter.item.AdapterItem;
import java.util.List;
/**
* @author ccj
* @date 2017/3/22
* 通用的adapter必须实现的接口,作为方法名统一的一个规范
*/
public interface IAdapter {
/**
* @param data 设置数据源
*/
void setData(@NonNull List data);
List getData();
/**
* @param t list中的一条数据
* @return 强烈建议返回string, int, bool类似的基础对象做type,不要返回data中的某个对象
*/
Object getItemType(T t);
/**
* 当缓存中无法得到所需item时才会调用
*
* @param type 通过{@link #getItemType(Object)}得到的type
* @return 任意类型的 AdapterItem
*/
@Keep
@NonNull
AdapterItem createItem(Object type);
/**
* 如果放入item的最终数据和list中的每一条数据类型是不同的,可以通过此方法进行转换
*
* @param data 从原始的list中取得得数据
* @param type item的类型
* @return 放入adapterItem的最终数据
*/
@Keep
@NonNull
Object getConvertedData(T data, Object type);
/**
* 通知adapter更新当前页面的所有数据
*/
void notifyDataSetChanged();
/**
* 得到当前要渲染的最后一个item的position
*/
int getCurrentPosition();
}
================================================
FILE: base/src/main/java/com/ccj/base/adapter/util/ItemTypeUtil.java
================================================
package com.ccj.base.adapter.util;
import android.support.annotation.VisibleForTesting;
import java.util.HashMap;
/**
* @author ccj
* @date 2017/3/22
*/
@VisibleForTesting
/*package*/ public class ItemTypeUtil {
private HashMap