如果视图类型的布局只有几个,并且绑定逻辑很简单,请遵循 Anton 的解决方案。但是,如果您需要管理复杂的布局和绑定逻辑,则代码将很混乱。
我相信以下解决方案对于需要处理复杂视图类型的人来说很有用。
基本数据精简体类
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 来创建类。
示例数据平台类
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 类,请创建一个适配器类。
基本数据绑定适配器类
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上留下了更详细的解决方案和示例,因此,如果需要,请参阅RecyclizerView-MultipleViewTypeAdapter。