VirtualLayout的是阿里巴巴的开源框架,作用是对recyclerview进行功能的扩展,将布局分为不同的区域,每个区域由独立的布局manager进行管理,从而实现在recyclerview中实现同时展示不同的布局效果
//v-layout
compile ('com.alibaba.android:vlayout:1.0.3@aar') {
transitive = true
}
//继承于DelegateAdapter.Adapter
public class MyVlayoutAdapter extends DelegateAdapter.Adapter<MyVlayoutAdapter.Holder> {
private Context context;
LayoutHelper layoutHelper;
RecyclerView.LayoutParams layoutParams;
int count = 0;
List datas;
public MyVlayoutAdapter(Context context, LayoutHelper layoutHelper, List datas) {
this(context, layoutHelper, datas.size(), new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 300));
}
public MyVlayoutAdapter(Context context, LayoutHelper layoutHelper, int count, RecyclerView.LayoutParams layoutParams) {
this.context = context;
this.layoutHelper = layoutHelper;
this.layoutParams = layoutParams;
this.count = count;
}
//与普通的adapter的唯一的区别在这里,需要在这里返回helper对象
@Override
public LayoutHelper onCreateLayoutHelper() {
return layoutHelper;
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.tab_item, parent, false);
return new Holder(view);
}
@Override
public void onBindViewHolder(Holder holder, int position) {
holder.iv.setImageResource(R.mipmap.ic_launcher);
holder.tv.setText("丫二咯"+position);
holder.tv.setTextColor(Color.BLACK);
}
@Override
public int getItemCount() {
return count;
}
//Holder类,用法与recyclerview相同
public class Holder extends RecyclerView.ViewHolder {
ImageView iv;
TextView tv;
public Holder(View itemView) {
super(itemView);
setView(itemView);
}
public void setView(View view) {
iv = view.findViewById(R.id.tab_imageview);
tv = view.findViewById(R.id.tab_textview);
}
}
}
/* 公共属性
* linearLayoutHelper.setItemCount(4);// 设置布局里Item个数,当与adapter中getItemCount不同时由adapter决定
linearLayoutHelper.setPadding(10,10,10,10);// 设置LayoutHelper的子元素相对LayoutHelper边缘的距离
linearLayoutHelper.setMargin(10,10,10,10);// 设置LayoutHelper边缘相对父控件(即RecyclerView)的距离
linearLayoutHelper.setBgColor(Color.GRAY);// 设置背景颜色
linearLayoutHelper.setAspectRatio(6);// 设置设置布局内每行布局的宽与高的比
* */
//绑定vlayoutmanager
VirtualLayoutManager vlayout = new VirtualLayoutManager(this);
rv.setLayoutManager(vlayout);
//helper对象,管理不同区域间的布局-------------------------------------------------------------------------------------------
//线性
LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();
linearLayoutHelper.setDividerHeight(2);
linearLayoutHelper.setMarginLeft(8);
MyVlayoutAdapter adapter = new MyVlayoutAdapter(this, linearLayoutHelper, datas);
//格子
GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(4);
gridLayoutHelper.setAutoExpand(false);
//设置每行的item的个数
gridLayoutHelper.setSpanCount(4);
gridLayoutHelper.setMargin(10,10,10,10);
gridLayoutHelper.setWeights(new float[]{30, 10, 30, 30});
gridLayoutHelper.setSpanSizeLookup(new GridLayoutHelper.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
//设置每个item占用多少个item
if (position < 25) {
return 4;
} else if (position < 50) {
return 2;
} else {
return 1;
}
}
});
MyVlayoutAdapter adapter2 = new MyVlayoutAdapter(this, gridLayoutHelper, datas);
//固定,只能显示一个
FixLayoutHelper fixLayoutHelper = new FixLayoutHelper(FixLayoutHelper.TOP_LEFT, 0, 0);
MyVlayoutAdapter adapter3 = new MyVlayoutAdapter(this, fixLayoutHelper, datas);
//固定布局,可以通过动作来设置是否显示,与FixLayoutHelper冲突
//SHOW_ALWAYS:与FixLayoutHelper的行为一致,固定在某个位置
//SHOW_ON_ENTER:默认不显示视图,当页面滚动到这个视图的位置的时候,才显示;
//SHOW_ON_LEAVE:默认不显示视图,当页面滚出这个视图的位置的时候显示
ScrollFixLayoutHelper scrollFixLayoutHelper = new ScrollFixLayoutHelper(ScrollFixLayoutHelper.TOP_RIGHT, 0, 0);
scrollFixLayoutHelper.setShowType(ScrollFixLayoutHelper.SHOW_ALWAYS);
MyVlayoutAdapter adapter4 = new MyVlayoutAdapter(this, scrollFixLayoutHelper, datas);
//设置浮动布局,FloatLayoutHelper设置的Item必须要在屏幕滚动到它那个实际原始位置,加载之后才能被拖动
FloatLayoutHelper floatLayoutHelper = new FloatLayoutHelper();
floatLayoutHelper.setDefaultLocation(20, 250);
MyVlayoutAdapter adapter5 = new MyVlayoutAdapter(this, floatLayoutHelper, datas);
//栏格布局,就是只有一栏的布局,这一栏可以设置多个Item,但是需要有对应的Weight属性
ColumnLayoutHelper columnLayoutHelper = new ColumnLayoutHelper();
columnLayoutHelper.setItemCount(5);
//总值为100
columnLayoutHelper.setWeights(new float[]{30, 10, 30, 20, 10});
MyVlayoutAdapter adapter6 = new MyVlayoutAdapter(this, columnLayoutHelper, datas.subList(0, 5));
//单独的一个item
SingleLayoutHelper singleLayoutHelper = new SingleLayoutHelper();
singleLayoutHelper.setItemCount(3);
MyVlayoutAdapter adapter7 = new MyVlayoutAdapter(this, singleLayoutHelper, datas.subList(0, 5));
/**OnePlusNLayoutHelper,核心布局
* 1 + 0 1 + 1
* ------------------------- -------------------------
* | | | | |
* | | | | |
* | 1 | | | |
* | | | 1 | 2 |
* | | | | |
* | | | | |
* ------------------------- -------------------------
*
*
* 1 + 2 1 + 3
* ------------------------- -------------------------
* | | | | | |
* | | 2 | | | 2 |
* | | | | | |
* | 1 |-----------| | 1 |-----------|
* | | | | | | |
* | | 3 | | | 3 | 4 |
* | | | | | | |
* ------------------------- -------------------------
*
* 1 + 4
* -------------------------
* | | |
* | | 2 |
* | | |
* | 1 |-----------|
* | | | | |
* | | 3 | 4 | 5 |
* | | | | |
* -------------------------
*/
OnePlusNLayoutHelper onePlusNLayoutHelper = new OnePlusNLayoutHelper(4);
MyVlayoutAdapter adapter8 = new MyVlayoutAdapter(this, onePlusNLayoutHelper, datas.subList(0, 5));
//设置Sticky布局,stikcy布局,根据stickyStart属性,当视图的位置在屏幕范围内时,
// 视图会随页面滚动而滚动;当视图的位置滑出屏幕时,StickyLayoutHelper会将视图固定在顶部或底部
StickyLayoutHelper stickyLayoutHelper = new StickyLayoutHelper();
stickyLayoutHelper.setStickyStart(true);
MyVlayoutAdapter adapter9 = new MyVlayoutAdapter(this, stickyLayoutHelper, datas.subList(0, 5));
//设置瀑布流布局,可以在holder中设置不同的高度
StaggeredGridLayoutHelper staggeredGridLayoutHelper = new StaggeredGridLayoutHelper();
staggeredGridLayoutHelper.setLane(3);
staggeredGridLayoutHelper.setHGap(5);//水平间距
staggeredGridLayoutHelper.setVGap(5);//垂直间距
MyVlayoutAdapter adapter10 = new MyVlayoutAdapter(this, staggeredGridLayoutHelper, datas);
//绑定所有adapter-------------------------------------------------------------------------------------------------------
List adapters = new ArrayList<>();
// adapters.add(adapter10);
// adapters.add(adapter8);
// adapters.add(adapter7);
// adapters.add(adapter6);
// adapters.add(adapter5);
// adapters.add(adapter4);
// adapters.add(adapter3);
adapters.add(adapter2);
// adapters.add(adapter9);
// adapters.add(adapter);
//绑定多个adapter,不是通过vlayout直接添加adapters,而是通过DelegateAdapter作为粘合剂连接layoutmanager和adapters,
//估计是vlayout直接添加adapters实现有难度或耦合性太强
DelegateAdapter delegateAdapter = new DelegateAdapter(vlayout);
delegateAdapter.setAdapters(adapters);
rv.setAdapter(delegateAdapter);
//在这里通过添加滚动监听判断是否到达底部实现上拉刷新,>>>不好实现,因为不同的布局难以判断recyclerview的总高度是多少
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
}