VLayout:阿里出品的布局管理器

简 介

VirtualLayout是一个针对RecyclerView的LayoutManager扩展, 主要提供一整套布局方案和布局间的组件复用的问题。

  • Github:https://github.com/alibaba/vlayout
  • Github:https://github.com/yibeiliu/VlayoutDemo

配 置

compile 'com.alibaba.android:vlayout:1.0.9'

初 步

  • 目前看了一下源码,大致能看懂其基本的设计思路,但具体的代码细节没有关注:

    • 其主要的关注点在于LayoutManagerAdapter,以及他们之间如何管理的。
  • 其Demo描述的东西:

    • MainActivity:展示了最基本的使用方式,但这种实现方式是使用了”一个Adapter配合多个Helpers”的方式,所以你必须去自己管理哪个位置显示什么东西。

    • VLayoutActivity:展示了应该使用的方式,使用”多个DelegateAdapter+多个Helpers”的方式,你只需要去关心单个DelegateAdapter的细节,大致的表述就是这样的。

使 用

  • 首先要搞清楚 HelperAdapter 的区别,因为区别于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 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,也可以自己定义一个,因为其本质上是 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 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 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 方法里面对每个位置的布局进行了安排。

你可能感兴趣的:(Android应用层)