vlayout

Tangram是阿里出品盆佣、用于快速實(shí)現(xiàn)組合布局的框架模型屏积,在手機(jī)天貓Android&iOS版 內(nèi)廣泛使用

該框架提供一系列基本單元布局,通過快速拼裝就能搭建出一個(gè)具備多種布局的頁面却嗡,就像使用七巧板 通過現(xiàn)有板塊 快速拼湊出 多樣的形狀一樣。


在性能方面暮现,希望 貼近Native開發(fā),重點(diǎn):頁面渲染效率 & 組件回收復(fù)用

頁面渲染:為了提升渲染效率楚昭,Tangram將在視圖渲染之前把大量的計(jì)算工作在VM中完成送矩,并緩存在VM組成的樹形結(jié)構(gòu)里。

回收和復(fù)用——Tangram在Android和iOS平臺(tái)上分別開發(fā)了VLayout和LazyScroll兩個(gè)基礎(chǔ)組件哪替,通過一個(gè)雙索引可見區(qū)域組件發(fā)現(xiàn)算法栋荸,實(shí)現(xiàn)了跨父節(jié)點(diǎn)組件的高效回收和復(fù)用。

對(duì)于Android:采用基于RecyclerView+自定義LayoutManager的實(shí)現(xiàn)方案


http://www.reibang.com/p/6b658c8802d1


如下是代碼實(shí)現(xiàn):其中主布局中只是v7下的Recyclerview凭舶,item為一個(gè)TextView和一個(gè)ImageView

package com.example.user.myapplication.v_layout_test;

import android.graphics.Color;

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.widget.RecyclerView;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Toast;

import com.alibaba.android.vlayout.DelegateAdapter;

import com.alibaba.android.vlayout.VirtualLayoutManager;

import com.alibaba.android.vlayout.layout.ColumnLayoutHelper;

import com.alibaba.android.vlayout.layout.FixLayoutHelper;

import com.alibaba.android.vlayout.layout.FloatLayoutHelper;

import com.alibaba.android.vlayout.layout.GridLayoutHelper;

import com.alibaba.android.vlayout.layout.LinearLayoutHelper;

import com.alibaba.android.vlayout.layout.OnePlusNLayoutHelper;

import com.alibaba.android.vlayout.layout.ScrollFixLayoutHelper;

import com.alibaba.android.vlayout.layout.SingleLayoutHelper;

import com.alibaba.android.vlayout.layout.StaggeredGridLayoutHelper;

import com.alibaba.android.vlayout.layout.StickyLayoutHelper;

import com.example.user.myapplication.R;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.List;

/**

* v_layout

*/

public class TangramMainActivity extends AppCompatActivity implements MyItemClickListener {

RecyclerView recyclerView;

MyAdapter Adapter_linearLayout,Adapter_GridLayout,Adapter_FixLayout,Adapter_ScrollFixLayout

,Adapter_FloatLayout,Adapter_ColumnLayout,Adapter_SingleLayout,Adapter_onePlusNLayout,

Adapter_StickyLayout,Adapter_StaggeredGridLayout;

private ArrayList> listItem;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_tangram_main);

getWindow().setBackgroundDrawable(null);

/**

*步驟1:創(chuàng)建RecyclerView & VirtualLayoutManager對(duì)象并進(jìn)行綁定

* */

recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

//創(chuàng)建RecyclerView對(duì)象

VirtualLayoutManager layoutManager = new VirtualLayoutManager(this);

//創(chuàng)建VirtualLayoutManager對(duì)象

//同時(shí)內(nèi)部會(huì)創(chuàng)建一個(gè)LayoutHelperFinder對(duì)象晌块,用來后續(xù)的LayoutHelper查找

recyclerView.setLayoutManager(layoutManager);

//將VirtualLayoutManager綁定到recyclerView

/**

*步驟2:設(shè)置組件復(fù)用回收池

* */

RecyclerView.RecycledViewPool viewPool = new RecyclerView.RecycledViewPool();

recyclerView.setRecycledViewPool(viewPool);

viewPool.setMaxRecycledViews(0, 10);

/**

*步驟3:設(shè)置需要存放的數(shù)據(jù)

* */

listItem = new ArrayList>();

for (int i = 0; i < 100; i++) {

HashMap map = new HashMap();

map.put("ItemTitle", "第" + i + "行");

map.put("ItemImage", R.mipmap.ic_launcher);

listItem.add(map);

}

/**

*步驟4:根據(jù)數(shù)據(jù)列表,創(chuàng)建對(duì)應(yīng)的LayoutHelper

* */

//為了展示效果,此處將上面介紹的所有布局都顯示出來

/**

設(shè)置線性布局

*/

LinearLayoutHelper linearLayoutHelper = new LinearLayoutHelper();

//創(chuàng)建對(duì)應(yīng)的LayoutHelper對(duì)象

//公共屬性

linearLayoutHelper.setItemCount(4);//設(shè)置布局里Item個(gè)數(shù)

linearLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

linearLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

// linearLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

linearLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

// linearLayoutHelper特有屬性

linearLayoutHelper.setDividerHeight(10);

//設(shè)置間隔高度

//設(shè)置的間隔會(huì)與RecyclerView的addItemDecoration()添加的間隔疊加.

linearLayoutHelper.setMarginBottom(100);

//設(shè)置布局底部與下個(gè)布局的間隔

//創(chuàng)建自定義的Adapter對(duì)象&綁定數(shù)據(jù)&綁定對(duì)應(yīng)的LayoutHelper進(jìn)行布局繪制

Adapter_linearLayout? = new MyAdapter(this, linearLayoutHelper, 4, listItem) {

//參數(shù)2:綁定綁定對(duì)應(yīng)的LayoutHelper

//參數(shù)3:傳入該布局需要顯示的數(shù)據(jù)個(gè)數(shù)

//參數(shù)4:傳入需要綁定的數(shù)據(jù)

//通過重寫onBindViewHolder()設(shè)置更豐富的布局效果

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

//為了展示效果,將布局的第一個(gè)數(shù)據(jù)設(shè)置為linearLayout

if (position == 0) {

holder.Text.setText("Linear");

}

//為了展示效果,將布局里不同位置的Item進(jìn)行背景顏色設(shè)置

//? ? ? ? ? ? ? ? if (position < 2) {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0x66cc0000 + (position - 6) * 128);

//? ? ? ? ? ? ? ? } else if (position % 2 == 0) {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0xaa22ff22);

//? ? ? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0xccff22ff);

//? ? ? ? ? ? ? ? }

holder.itemView.setBackgroundColor(Color.GRAY);

}

};

Adapter_linearLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置吸邊布局

*/

StickyLayoutHelper stickyLayoutHelper = new StickyLayoutHelper();

//公共屬性

stickyLayoutHelper.setItemCount(3);//設(shè)置布局里Item個(gè)數(shù)

stickyLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

stickyLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

stickyLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

stickyLayoutHelper.setAspectRatio(3);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

//特有屬性

stickyLayoutHelper.setStickyStart(true);

// true =組件吸在頂部

// false =組件吸在底部

stickyLayoutHelper.setOffset(100);//設(shè)置吸邊位置的偏移量

Adapter_StickyLayout = new MyAdapter(this, stickyLayoutHelper,1, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是1

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為Stick

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

if (position == 0) {

holder.Text.setText("Stick");

}

}

};

Adapter_StickyLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置可選固定布局

*/

ScrollFixLayoutHelper scrollFixLayoutHelper = new ScrollFixLayoutHelper(ScrollFixLayoutHelper.TOP_RIGHT,0,0);

//參數(shù)說明:

//參數(shù)1:設(shè)置吸邊時(shí)的基準(zhǔn)位置(alignType) -有四個(gè)取值:TOP_LEFT(默認(rèn)), TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT

//參數(shù)2:基準(zhǔn)位置的偏移量x

//參數(shù)3:基準(zhǔn)位置的偏移量y

//公共屬性

scrollFixLayoutHelper.setItemCount(1);//設(shè)置布局里Item個(gè)數(shù)

//從設(shè)置Item數(shù)目的源碼可以看出,一個(gè)FixLayoutHelper只能設(shè)置一個(gè)

//? ? ? ? @Override

//? ? ? ? public void setItemCount(int itemCount) {

//? ? ? ? ? ? if (itemCount > 0) {

//? ? ? ? ? ? ? ? super.setItemCount(1);

//? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? super.setItemCount(0);

//? ? ? ? ? ? }

//? ? ? ? }

scrollFixLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

scrollFixLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

scrollFixLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

scrollFixLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

// fixLayoutHelper特有屬性

scrollFixLayoutHelper.setAlignType(FixLayoutHelper.TOP_LEFT);//設(shè)置吸邊時(shí)的基準(zhǔn)位置(alignType)

scrollFixLayoutHelper.setX(30);//設(shè)置基準(zhǔn)位置的橫向偏移量X

scrollFixLayoutHelper.setY(50);//設(shè)置基準(zhǔn)位置的縱向偏移量Y

scrollFixLayoutHelper.setShowType(ScrollFixLayoutHelper.SHOW_ON_LEAVE);//設(shè)置Item的顯示模式

Adapter_ScrollFixLayout? = new MyAdapter(this, scrollFixLayoutHelper,1, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是1

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為scrollFix

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

if (position == 0) {

holder.Text.setText("scrollFix");

}

}

};

Adapter_ScrollFixLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置Grid布局

*/

GridLayoutHelper gridLayoutHelper = new GridLayoutHelper(3);

//在構(gòu)造函數(shù)設(shè)置每行的網(wǎng)格個(gè)數(shù)

//公共屬性

gridLayoutHelper.setItemCount(36);//設(shè)置布局里Item個(gè)數(shù)

gridLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

gridLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

// gridLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

gridLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

// gridLayoutHelper特有屬性

gridLayoutHelper.setWeights(new float[]{40, 30, 30});//設(shè)置每行中 每個(gè)網(wǎng)格寬度 占 每行總寬度 的比例

gridLayoutHelper.setVGap(20);//控制子元素之間的垂直間距

gridLayoutHelper.setHGap(20);//控制子元素之間的水平間距

gridLayoutHelper.setAutoExpand(false);//是否自動(dòng)填充空白區(qū)域

gridLayoutHelper.setSpanCount(3);//設(shè)置每行多少個(gè)網(wǎng)格

//通過自定義SpanSizeLookup來控制某個(gè)Item的占網(wǎng)格個(gè)數(shù)

gridLayoutHelper.setSpanSizeLookup(new GridLayoutHelper.SpanSizeLookup() {

@Override

public int getSpanSize(int position) {

if (position > 7) {

return 3;

//第7個(gè)位置后,每個(gè)Item占3個(gè)網(wǎng)格

} else {

return 2;

//第7個(gè)位置前,每個(gè)Item占2個(gè)網(wǎng)格

}

}

});

Adapter_GridLayout? = new MyAdapter(this, gridLayoutHelper,36, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是8,即展示總數(shù)是8個(gè),然后每行是4個(gè)(上面設(shè)置的)

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為gridLayoutHelper

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

//為了展示效果,將布局里不同位置的Item進(jìn)行背景顏色設(shè)置

//? ? ? ? ? ? ? ? if (position < 2) {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0x66cc0000 + (position - 6) * 128);

//? ? ? ? ? ? ? ? } else if (position % 2 == 0) {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0xaa22ff22);

//? ? ? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0xccff22ff);

//? ? ? ? ? ? ? ? }

holder.itemView.setBackgroundColor(Color.GRAY);

if (position == 0) {

holder.Text.setText("Grid");

}

}

};

Adapter_GridLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置固定布局

*/

FixLayoutHelper fixLayoutHelper = new FixLayoutHelper(FixLayoutHelper.TOP_LEFT,40,100);

//參數(shù)說明:

//參數(shù)1:設(shè)置吸邊時(shí)的基準(zhǔn)位置(alignType) -有四個(gè)取值:TOP_LEFT(默認(rèn)), TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT

//參數(shù)2:基準(zhǔn)位置的偏移量x

//參數(shù)3:基準(zhǔn)位置的偏移量y

//公共屬性

fixLayoutHelper.setItemCount(1);//設(shè)置布局里Item個(gè)數(shù)

//從設(shè)置Item數(shù)目的源碼可以看出帅霜,一個(gè)FixLayoutHelper只能設(shè)置一個(gè)

//? ? ? ? @Override

//? ? ? ? public void setItemCount(int itemCount) {

//? ? ? ? ? ? if (itemCount > 0) {

//? ? ? ? ? ? ? ? super.setItemCount(1);

//? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? super.setItemCount(0);

//? ? ? ? ? ? }

//? ? ? ? }

fixLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

fixLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

fixLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

fixLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

// fixLayoutHelper特有屬性

fixLayoutHelper.setAlignType(FixLayoutHelper.TOP_LEFT);//設(shè)置吸邊時(shí)的基準(zhǔn)位置(alignType)

fixLayoutHelper.setX(30);//設(shè)置基準(zhǔn)位置的橫向偏移量X

fixLayoutHelper.setY(50);//設(shè)置基準(zhǔn)位置的縱向偏移量Y

Adapter_FixLayout? = new MyAdapter(this, fixLayoutHelper,1, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是1

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為Fix

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

if (position == 0) {

holder.Text.setText("Fix");

}

}

};

Adapter_FixLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置浮動(dòng)布局

*/

FloatLayoutHelper floatLayoutHelper = new FloatLayoutHelper();

//創(chuàng)建FloatLayoutHelper對(duì)象

//公共屬性

floatLayoutHelper.setItemCount(1);//設(shè)置布局里Item個(gè)數(shù)

//從設(shè)置Item數(shù)目的源碼可以看出匆背,一個(gè)FixLayoutHelper只能設(shè)置一個(gè)

//? ? ? ? @Override

//? ? ? ? public void setItemCount(int itemCount) {

//? ? ? ? ? ? if (itemCount > 0) {

//? ? ? ? ? ? ? ? super.setItemCount(1);

//? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? super.setItemCount(0);

//? ? ? ? ? ? }

//? ? ? ? }

floatLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

floatLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

floatLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

floatLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

// floatLayoutHelper特有屬性

floatLayoutHelper.setDefaultLocation(300, 300);//設(shè)置布局里Item的初始位置

Adapter_FloatLayout = new MyAdapter(this, floatLayoutHelper,1, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是1

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為float

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(500,1000);

holder.itemView.setLayoutParams(layoutParams);

//? ? ? ? holder.itemView.setBackgroundColor(Color.RED);

holder.itemView.setBackgroundColor(Color.GRAY);

if (position == 0) {

holder.Text.setText("float");

}

}

};

Adapter_FloatLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置欄格布局

*/

ColumnLayoutHelper columnLayoutHelper = new ColumnLayoutHelper();

//創(chuàng)建對(duì)象

//公共屬性

columnLayoutHelper.setItemCount(3);//設(shè)置布局里Item個(gè)數(shù)

columnLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

columnLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

columnLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

columnLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

// columnLayoutHelper特有屬性

columnLayoutHelper.setWeights(new float[]{30, 40, 30});//設(shè)置該行每個(gè)Item占該行總寬度的比例

Adapter_ColumnLayout = new MyAdapter(this, columnLayoutHelper,3, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是3

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為Column

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

if (position == 0) {

holder.Text.setText("Column");

}

}

};

Adapter_ColumnLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置通欄布局

*/

SingleLayoutHelper singleLayoutHelper = new SingleLayoutHelper();

//公共屬性

singleLayoutHelper.setItemCount(3);//設(shè)置布局里Item個(gè)數(shù)

singleLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

singleLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

singleLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

singleLayoutHelper.setAspectRatio(6);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

Adapter_SingleLayout = new MyAdapter(this, singleLayoutHelper,1, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是1

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為Single

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

if (position == 0) {

holder.Text.setText("Single");

}

}

};

Adapter_SingleLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置1拖N布局

*/

OnePlusNLayoutHelper onePlusNLayoutHelper = new OnePlusNLayoutHelper(5);

//在構(gòu)造函數(shù)里傳入顯示的Item數(shù)

//最多是1拖4,即5個(gè)

//公共屬性

onePlusNLayoutHelper.setItemCount(3);//設(shè)置布局里Item個(gè)數(shù)

onePlusNLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

onePlusNLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

onePlusNLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

onePlusNLayoutHelper.setAspectRatio(3);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

Adapter_onePlusNLayout = new MyAdapter(this, onePlusNLayoutHelper,5, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是5,即1拖4

//為了展示效果,通過重寫onBindViewHolder()將布局的第一個(gè)數(shù)據(jù)設(shè)置為onePlus

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

if (position == 0) {

holder.Text.setText("onePlus");

}

}

};

Adapter_onePlusNLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

設(shè)置瀑布流布局

*/

StaggeredGridLayoutHelper staggeredGridLayoutHelper = new StaggeredGridLayoutHelper();

//創(chuàng)建對(duì)象

//公有屬性

staggeredGridLayoutHelper.setItemCount(20);//設(shè)置布局里Item個(gè)數(shù)

staggeredGridLayoutHelper.setPadding(20, 20, 20, 20);//設(shè)置LayoutHelper的子元素相對(duì)LayoutHelper邊緣的距離

staggeredGridLayoutHelper.setMargin(20, 20, 20, 20);//設(shè)置LayoutHelper邊緣相對(duì)父控件(即RecyclerView)的距離

staggeredGridLayoutHelper.setBgColor(Color.GRAY);//設(shè)置背景顏色

staggeredGridLayoutHelper.setAspectRatio(3);//設(shè)置設(shè)置布局內(nèi)每行布局的寬與高的比

//特有屬性

staggeredGridLayoutHelper.setLane(3);//設(shè)置控制瀑布流每行的Item數(shù)

staggeredGridLayoutHelper.setHGap(20);//設(shè)置子元素之間的水平間距

staggeredGridLayoutHelper.setVGap(15);//設(shè)置子元素之間的垂直間距

Adapter_StaggeredGridLayout = new MyAdapter(this, staggeredGridLayoutHelper,20, listItem) {

//設(shè)置需要展示的數(shù)據(jù)總數(shù),此處設(shè)置是20

//通過重寫onBindViewHolder()設(shè)置更加豐富的布局

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

super.onBindViewHolder(holder, position);

ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,150 +position % 5 * 20);

holder.itemView.setLayoutParams(layoutParams);

//為了展示效果,設(shè)置不同位置的背景色

//? ? ? ? ? ? ? ? if (position > 10) {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0x66cc0000 + (position - 6) * 128);

//? ? ? ? ? ? ? ? } else if (position % 2 == 0) {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0xaa22ff22);

//? ? ? ? ? ? ? ? } else {

//? ? ? ? ? ? ? ? ? ? holder.itemView.setBackgroundColor(0xccff22ff);

//? ? ? ? ? ? ? ? }

holder.itemView.setBackgroundColor(Color.GRAY);

//為了展示效果,通過將布局的第一個(gè)數(shù)據(jù)設(shè)置為staggeredGrid

if (position == 0) {

holder.Text.setText("staggeredGrid");

}

}

};

Adapter_StaggeredGridLayout.setOnItemClickListener(this);

//設(shè)置每個(gè)Item的點(diǎn)擊事件

/**

*步驟5:將生成的LayoutHelper交給Adapter,并綁定到RecyclerView對(duì)象

**/

// 1.設(shè)置Adapter列表(同時(shí)也是設(shè)置LayoutHelper列表)

List adapters = new LinkedList<>();

// 2.將上述創(chuàng)建的Adapter對(duì)象放入到DelegateAdapter.Adapter列表里

adapters.add(Adapter_linearLayout) ;

adapters.add(Adapter_StickyLayout) ;

adapters.add(Adapter_ScrollFixLayout) ;

adapters.add(Adapter_GridLayout) ;

adapters.add(Adapter_FixLayout) ;

adapters.add(Adapter_FloatLayout) ;

adapters.add(Adapter_ColumnLayout) ;

adapters.add(Adapter_SingleLayout) ;

adapters.add(Adapter_onePlusNLayout) ;

adapters.add(Adapter_StaggeredGridLayout) ;

//

// 3.創(chuàng)建DelegateAdapter對(duì)象&將layoutManager綁定到DelegateAdapter

DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager);

// 4.將DelegateAdapter.Adapter列表綁定到DelegateAdapter

delegateAdapter.setAdapters(adapters);

// 5.將delegateAdapter綁定到recyclerView

recyclerView.setAdapter(delegateAdapter);

//? ? ? ? /**

//? ? ? ? *步驟6:設(shè)置分割線& Item之間的間隔

//? ? ? ? **/

//? ? ? ? recyclerView.addItemDecoration(new DividerItemDecoration(this, layoutManager.getOrientation()));

//? ? ? ? //需要自定義類DividerItemDecoration

//? ? ? ? recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {

//? ? ? ? ? ? public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {

//? ? ? ? ? ? ? ? outRect.set(5, 5, 5, 5);

//? ? ? ? ? ? }

//? ? ? ? });

}

/**

*步驟7:實(shí)現(xiàn)Item點(diǎn)擊事件

**/

//點(diǎn)擊事件的回調(diào)函數(shù)

@Override

public void onItemClick(View view, int postion) {

System.out.println("點(diǎn)擊了第"+postion+"行");

Toast.makeText(this, (String) listItem.get(postion).get("ItemTitle"), Toast.LENGTH_SHORT).show();

}

}




package com.example.user.myapplication.v_layout_test;

import android.content.Context;

import android.support.annotation.NonNull;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ImageView;

import android.widget.TextView;

import com.alibaba.android.vlayout.DelegateAdapter;

import com.alibaba.android.vlayout.LayoutHelper;

import com.example.user.myapplication.R;

import java.util.ArrayList;

import java.util.HashMap;

/**

*/

public class MyAdapter extends DelegateAdapter.Adapter {

//使用DelegateAdapter首先就是要自定義一個(gè)它的內(nèi)部類Adapter身冀,讓LayoutHelper和需要綁定的數(shù)據(jù)傳進(jìn)去

//此處的Adapter和普通RecyclerView定義的Adapter只相差了一個(gè)onCreateLayoutHelper()方法钝尸,其他的都是一樣的做法.

private ArrayList> listItem;

//用于存放數(shù)據(jù)列表

private Context context;

private LayoutHelper layoutHelper;

private RecyclerView.LayoutParams layoutParams;

private int count = 0;

private MyItemClickListener myItemClickListener;

//用于設(shè)置Item點(diǎn)擊事件

//構(gòu)造函數(shù)(傳入每個(gè)的數(shù)據(jù)列表&展示的Item數(shù)量)

publicMyAdapter(Context context, LayoutHelper layoutHelper, int count, ArrayList> listItem) {

this(context, layoutHelper, count, new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 300), listItem);

}

publicMyAdapter(Context context, LayoutHelper layoutHelper, int count, @NonNull RecyclerView.LayoutParams layoutParams, ArrayList> listItem) {

this.context = context;

this.layoutHelper = layoutHelper;

this.count = count;

this.layoutParams = layoutParams;

this.listItem = listItem;

}

//把ViewHolder綁定Item的布局

@Override

public MainViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

return new MainViewHolder(LayoutInflater.from(context).inflate(R.layout.tangram_main_item, parent, false));

}

//此處的Adapter和普通RecyclerView定義的Adapter只相差了一個(gè)onCreateLayoutHelper()方法

@Override

public LayoutHelper onCreateLayoutHelper() {

return layoutHelper;

}

//綁定Item的數(shù)據(jù)

@Override

public void onBindViewHolder(MainViewHolder holder, int position) {

holder.Text.setText((String) listItem.get(position).get("ItemTitle"));

holder.image.setImageResource((Integer) listItem.get(position).get("ItemImage"));

}

//返回Item數(shù)目

@Override

public int getItemCount() {

return count;

}

//設(shè)置Item的點(diǎn)擊事件

//綁定MainActivity傳進(jìn)來的點(diǎn)擊監(jiān)聽器

public void setOnItemClickListener(MyItemClickListener listener) {

myItemClickListener = listener;

}

//定義Viewholder

public? class MainViewHolder extends RecyclerView.ViewHolder {

public TextView Text;

public ImageView image;

publicMainViewHolder(View root) {

super(root);

//綁定視圖

Text = (TextView) root.findViewById(R.id.Item);

image = (ImageView) root.findViewById(R.id.Image);

root.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

if (myItemClickListener != null)

myItemClickListener.onItemClick(v, getPosition());

}

}

//監(jiān)聽到點(diǎn)擊就回調(diào)MainActivity的onItemClick函數(shù)

);

}

public TextView getText() {

return Text;

}

}

}

如下圖是過度繪制的顏色分類:其中藍(lán)色、淡綠搂根、淡紅珍促、深紅代表了4種不同程度的overdraw情況,我們的目標(biāo)就是盡量減少紅色的overdraw剩愧,看到更多藍(lán)色區(qū)域


如下是demo的過度繪制情況:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末猪叙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仁卷,更是在濱河造成了極大的恐慌穴翩,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锦积,死亡現(xiàn)場離奇詭異芒帕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丰介,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門背蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人基矮,你說我怎么就攤上這事淆储。” “怎么了家浇?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵本砰,是天一觀的道長。 經(jīng)常有香客問我钢悲,道長点额,這世上最難降的妖魔是什么舔株? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮还棱,結(jié)果婚禮上载慈,老公的妹妹穿的比我還像新娘。我一直安慰自己珍手,他們只是感情好办铡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著琳要,像睡著了一般寡具。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稚补,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天童叠,我揣著相機(jī)與錄音,去河邊找鬼课幕。 笑死厦坛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乍惊。 我是一名探鬼主播杜秸,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼污桦!你這毒婦竟也來了亩歹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤凡橱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亭姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稼钩,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年达罗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坝撑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡粮揉,死狀恐怖巡李,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扶认,我是刑警寧澤侨拦,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站辐宾,受9級(jí)特大地震影響狱从,放射性物質(zhì)發(fā)生泄漏膨蛮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一季研、第九天 我趴在偏房一處隱蔽的房頂上張望敞葛。 院中可真熱鬧,春花似錦与涡、人聲如沸惹谐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豺鼻。三九已至,卻和暖如春款慨,著一層夾襖步出監(jiān)牢的瞬間儒飒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工檩奠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桩了,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓埠戳,卻偏偏與公主長得像井誉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子整胃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 大家好颗圣,今天又帶來了項(xiàng)目中具體遇到的需求。做一個(gè)首界面屁使,該首界面有很多功能塊在岂,同時(shí)這些功能塊是動(dòng)態(tài)的,因?yàn)榈卿浀娜?..
    青蛙要fly閱讀 4,919評(píng)論 7 36
  • 為什么要使用vlayout [vlayout]是對(duì)RecyclerView的LayoutManage的擴(kuò)展蛮寂,所以它...
    Gugigugi閱讀 5,705評(píng)論 0 2
  • 作業(yè)一:計(jì)算兩個(gè)班的人數(shù) 作業(yè)二:取余運(yùn)算 作業(yè)三:求差值 作業(yè)四:輸入操作
    回憶不淡閱讀 174評(píng)論 0 0
  • 剛點(diǎn)開男閨蜜的對(duì)話框蔽午,想對(duì)他哭訴自己找工作的郁悶和糾結(jié),剛打出我又失業(yè)了酬蹋,想了想又全數(shù)刪除及老。 昨夜里我...
    From旮旯閱讀 157評(píng)論 0 1
  • 我是個(gè)感性的人會(huì)為一首歌感動(dòng),會(huì)為一句話流淚,當(dāng)然也會(huì)為自己的沖動(dòng)付出代價(jià). 一直很想去西藏那個(gè)神秘的地方...
    木棉花625閱讀 294評(píng)論 2 3