简 介
VirtualLayout是一个针对RecyclerView的LayoutManager扩展, 主要提供一整套布局方案和布局间的组件复用的问题。
配 置
compile 'com.alibaba.android:vlayout:1.0.9'
初 步
目前看了一下源码,大致能看懂其基本的设计思路,但具体的代码细节没有关注:
- 其主要的关注点在于
LayoutManager
和Adapter
,以及他们之间如何管理的。
- 其主要的关注点在于
其Demo描述的东西:
MainActivity:展示了最基本的使用方式,但这种实现方式是使用了”一个Adapter配合多个Helpers”的方式,所以你必须去自己管理哪个位置显示什么东西。
VLayoutActivity:展示了应该使用的方式,使用”多个DelegateAdapter+多个Helpers”的方式,你只需要去关心单个DelegateAdapter的细节,大致的表述就是这样的。
使 用
首先要搞清楚
Helper
与Adapter
的区别,因为区别于BaseAdapter
这个开源框架,后者通过包裹Adapter
来实现布局的变化,而前者只有一个Adapter
,只是通过改变LayoutManager
来实现界面的不同。比如
SingleLayoutHelper
,它代表了一个单独的Item
,你添加一个SingleLayoutHelper
,就会出现一个Item
,原本的布局特性也会被改变,所以在onBindViewHolder
方法中要对布局进行变化。创建一个 RecyclerView:
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
- 创建一个 LayoutManager:
VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);
- 使用一个集合来存放 Helpler,并开始不断创建 Helpler,Helpler 种类很多:
List<LayoutHelper> helpers = new LinkedList<>();
SingleLayoutHelper mHelper1 = new SingleLayoutHelper(); // 单行
mHelper1.setBgColor(Color.parseColor("#ebebeb"));
helpers.add(mHelper1);
GridLayoutHelper mHelper4 = new GridLayoutHelper(5, 10); // Grid 布局
helpers.add(mHelper4);
LinearLayoutHelper mHelper3 = new LinearLayoutHelper(); // 很多行,需要设置行数,还需要在内部使用布局参数
mHelper3.setItemCount(30);
helpers.add(mHelper3);
- 填充完毕之后就放置到 LayoutManager 中:
layoutManager.setLayoutHelpers(helpers);
- 创建一个 Adapter,传入 LayoutManager ,注意这个适配器必须可以继承
VirtualLayoutAdapter<VH>
,也可以自己定义一个,因为其本质上是 RecyclerView.ViewHolder:
class MMLayoutAdapter extends VirtualLayoutAdapter<MMLayoutAdapter.ViewHolder>{
.......
class ViewHolder extends RecyclerView.ViewHolder{
public ViewHolder(View itemView) {
super(itemView);
}
}
}
- 注意:这里不止要传入一个数据集,而是你传入了几个 Helpler,就需要给其定制数据集,我的例子里面没有放入数据集,而是添加了一个上拉记载刷新的方法,这个方法是参考 BaseAdapter 框架里面的
LoadMoreWrapper
,因为用的比较多:
public class MMLayoutAdapter extends VirtualLayoutAdapter<MMLayoutAdapter.ViewHolder> {
private Context mContext;
private final static int LOAD_MORE = 1;
private final static int NORMAL = 2;
private OnLoadMoreListener moreListener;
public MMLayoutAdapter(@NonNull VirtualLayoutManager layoutManager,
Context context) {
super(layoutManager);
mContext = context;
}
public void setLoadMoreListener(OnLoadMoreListener listener){
moreListener = listener;
}
private boolean isShowLoadMore(int position)
{
int count = 0;
List<LayoutHelper> helpers = getLayoutHelpers();
for (int i = 0, size = helpers.size(); i < size; i++) {
count += helpers.get(i).getItemCount();
}
return position >= count;
}
@Override
public int getItemViewType(int position) {
if (isShowLoadMore(position)){
return LOAD_MORE;
}
return NORMAL;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case LOAD_MORE:
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_load_more, null));
case NORMAL:
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_a, null));
default:
return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_a, null));
}
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Log.e("dc", "onBindViewHolder ----- position = " + position);
if (position == 0){
}else if (position == 1){
}else if (position >= 2 && position <=11){
RecyclerView.LayoutParams mParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200);
holder.itemView.setLayoutParams(mParams);
}else if (position >= 12){
RecyclerView.LayoutParams mParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 200);
holder.itemView.setLayoutParams(mParams);
}
if (isShowLoadMore(position)){
RecyclerView.LayoutParams mParams = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
holder.itemView.setLayoutParams(mParams);
holder.itemView.setBackgroundColor(Color.RED);
if (moreListener != null) moreListener.onLoadMoreRequested();
}
}
@Override
public int getItemCount() {
List<LayoutHelper> helpers = getLayoutHelpers();
if (helpers == null) {
return 0;
}
int count = 0;
for (int i = 0, size = helpers.size(); i < size; i++) {
count += helpers.get(i).getItemCount();
}
return count + 1;
}
class ViewHolder extends RecyclerView.ViewHolder{
public ViewHolder(View itemView) {
super(itemView);
}
}
public interface OnLoadMoreListener
{
void onLoadMoreRequested();
}
}
- 在
onBindViewHolder
方法里面对每个位置的布局进行了安排。