如果视图类型的布局很少,而且绑定逻辑很简单,那么请遵循Anton的解决方案。但是,如果需要管理复杂的布局和绑定逻辑,代码就会很混乱。
我相信下面的解决方案对于需要处理复杂视图类型的人是有用的。
基本DataBinder类
abstract public class DataBinder<T extends RecyclerView.ViewHolder> {
private DataBindAdapter mDataBindAdapter;
public DataBinder(DataBindAdapter dataBindAdapter) {
mDataBindAdapter = dataBindAdapter;
}
abstract public T newViewHolder(ViewGroup parent);
abstract public void bindViewHolder(T holder, int position);
abstract public int getItemCount();
......
}
在这个类中需要定义的函数与创建单一视图类型时的适配器类几乎相同。
对于每个视图类型,通过扩展这个DataBinder来创建类。
样例DataBinder类
public class Sample1Binder extends DataBinder<Sample1Binder.ViewHolder> {
private List<String> mDataSet = new ArrayList();
public Sample1Binder(DataBindAdapter dataBindAdapter) {
super(dataBindAdapter);
}
@Override
public ViewHolder newViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.layout_sample1, parent, false);
return new ViewHolder(view);
}
@Override
public void bindViewHolder(ViewHolder holder, int position) {
String title = mDataSet.get(position);
holder.mTitleText.setText(title);
}
@Override
public int getItemCount() {
return mDataSet.size();
}
public void setDataSet(List<String> dataSet) {
mDataSet.addAll(dataSet);
}
static class ViewHolder extends RecyclerView.ViewHolder {
TextView mTitleText;
public ViewHolder(View view) {
super(view);
mTitleText = (TextView) view.findViewById(R.id.title_type1);
}
}
}
为了管理DataBinder类,需要创建一个适配器类。
基DataBindAdapter类
abstract public class DataBindAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return getDataBinder(viewType).newViewHolder(parent);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
int binderPosition = getBinderPosition(position);
getDataBinder(viewHolder.getItemViewType()).bindViewHolder(viewHolder, binderPosition);
}
@Override
public abstract int getItemCount();
@Override
public abstract int getItemViewType(int position);
public abstract <T extends DataBinder> T getDataBinder(int viewType);
public abstract int getPosition(DataBinder binder, int binderPosition);
public abstract int getBinderPosition(int position);
......
}
通过扩展这个基类来创建类,然后实例化DataBinder类并覆盖抽象方法
getItemCount
返回DataBinders的项目总数
getItemViewType
定义适配器位置和视图类型之间的映射逻辑。
getDataBinder
根据视图类型返回DataBinder实例
getPosition
定义从指定DataBinder中的位置到适配器位置的转换逻辑
getBinderPosition
定义从适配器位置到DataBinder中的位置的转换逻辑
我在GitHub上留下了更详细的解决方案和示例,所以如果你需要,请参考RecyclerView-MultipleViewTypeAdapter。