关于VLayout不支持横向线性布局的个人解决方案,有需要的进来看看
Author: XXQAQCreated May 23, 2019Updated Mar 8, 2021
我觉得横向线性布局在开发中还是一个很常见的需求,VLayout官方不提供这个功能导致要做很多处理,如果处理地不好的话好会导致这部分Adapter不能复用,这对于我这种代码洁癖的人来说还是很苦恼的。 经过再三考虑,我使用了装饰者模式封装了一个横向布局Adapter,外界只需要传入真实的Adapter即可实现横向布局,以下为代码 ` public class VLayoutHorizontalAdapter extends DelegateAdapter.Adapter{
private RecyclerView.Adapter adapter;
private int spanCount = 1; //横向的列,填1相当于横向线性布局,根据自己的需求更改这个值
private RecyclerView.ItemDecoration decoration;
public VLayoutHorizontalAdapter(RecyclerView.Adapter adapter) {
this.adapter = adapter;
}
public VLayoutHorizontalAdapter(RecyclerView.Adapter adapter, int spanCount) {
this.adapter = adapter;
this.spanCount = spanCount;
}
public VLayoutHorizontalAdapter(RecyclerView.Adapter adapter, int spanCount, RecyclerView.ItemDecoration decoration) {
this.adapter = adapter;
this.spanCount = spanCount;
this.decoration = decoration;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
RecyclerView rv = new RecyclerView(viewGroup.getContext());
rv.setLayoutManager(new GridLayoutManager(viewGroup.getContext(),spanCount,RecyclerView.HORIZONTAL,false));
if (decoration != null) rv.addItemDecoration(decoration);
rv.setAdapter(adapter);
return new BaseViewHolder(rv,viewType);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
adapter.notifyDataSetChanged();
}
@Override
public int getItemCount() {
return 1;
}
@Override
public LayoutHelper onCreateLayoutHelper() {
return new LinearLayoutHelper();
}
} `
使用时只需要如下调用 delegateAdapter.addAdapter(new VLayoutHorizontalAdapter(new ReallyAdapter()));
PS:外界不需要持有ReallyAdapter引用,因为VLayoutHorizontalAdapter已经做了处理,更新VLayoutHorizontalAdapter即可更新ReallyAdapter。还有一点就是DelegateAdapter.Adapter继承于RecyclerView.Adapter,具体好处自己体会
Source: alibaba/vlayout