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

簡 介

VirtualLayout是一個針對RecyclerView的LayoutManager擴展, 主要提供一整套佈局方案和佈局間的組件複用的問題。

配 置

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<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 方法裏面對每個位置的佈局進行了安排。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章