#449·vlayout

关于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,具体好处自己体会