## 1.Import dependency Find the lastest version from [release notes](https://github.com/alibaba/Tangram-Android/releases), such as: ``` // gradle compile 'com.alibaba.android:tangram:2.0.5@aar' // we added rxjava in latest version, so need compile rxjava compile 'io.reactivex.rxjava2:rxjava:2.1.12' compile 'io.reactivex.rxjava2:rxandroid:2.0.2' ``` or ``` // maven com.alibaba.android tangram 2.0.5 aar io.reactivex.rxjava2 rxjava 2.1.12 aar io.reactivex.rxjava2 rxandroid 2.0.2 aar ``` ## 2.Initialize Tangram Initialize Tangram globally, provide a universal image loader, and a custom ImageView class(Usually an app has a custom ImageView class extended from system ImageView, provide system ImageView by default). ``` TangramBuilder.init(context, new IInnerImageSetter() { @Override public void doLoadImageUrl(@NonNull IMAGE view, @Nullable String url) { //here assume you use Picasso to load image Picasso.with(context).load(url).into(view); } }, ImageView.class); ``` ## 3.Initialize ```TangramBuilder``` Initialize ```TangramBuilder``` at the ```onCreate()``` of your Activity, assume your Activity is ```TangramActivity```. ``` TangramBuilder.InnerBuilder builder = TangramBuilder.newInnerBuilder(TangramActivity.this); ``` When the builder object created, default cards and cells supported by Tangram is already registered. An default ```IAdapterBuilder``` is also created to create an ```Adapter``` instance used by ```RecyclerView```. ## 4.Register custom card and cell The default cards provided by framework meets the most UI situation, while cells need be provided by Tangram users. There's three ways to register a custom: + bind a cell's type to a custom view class using ```builder.registerCell(1, TestView.class);```, which means a cell's data with type 1 will be binded to an instance of type ```TestView```. Registering in this way, the cell use general model class ```BaseCell```. + bind a cell's type to a custom model class and custom view class using ```builder.registerCell(1, TestCell.class, TestView.class);```, which means a cell with type 1 will use custom model class ```TestCell``` which should be extended from ```BaseCell``` and its data will be binded to an instance of ```TestView``` during rendering. + bind a cell's type to a custom class and custom viewholder class using ```builder.registerCell(1, TestCell.class, new ViewHolderCreator<>(R.layout.item_holder, TestViewHolder.class, TestView.class));```, which means a cell with type 1 will use custom model class ```TestCell``` which should be extended from ```BaseCell``` and its data will be binded to a view instance created by ```ViewHolderCreator ```. The view creator inflates the view from ```R.layout.item_holder``` and binds it to the ```TestViewHolder``` instance. The most common way to regiser custom cell is the former two. As to developping a custom cell, please read [document]() here. ## 5.Create ```TangramEngine``` instance Call: ``` TangramEngine engine = builder.build(); ``` ## 6.Register support module to engine Tangram provides some common support module to assist business development. Users could also register your custom support module. Here are three build-in support modules, for more details see [document](). ``` engine.register(SimpleClickSupport.class, new XXClickSupport()); engine.register(CardLoadSupport.class, new XXCardLoadSupport()); engine.register(ExposureSupport.class, new XXExposureSuport()); ``` ## 7.Bind to recyclerView ``` setContentView(R.layout.main_activity); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.main_view); ... engine.bindView(recyclerView); ``` ## 8.Listen recyclerView's onScroll ``` recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //trigger engine's onScroll to preload data if needed engine.onScrolled(); } }); ``` ## 9.Setting fix offset to float views (Option) If your recycelrView has other view coverd on top of it, such as a tabbar at bottom or a actionbar at top. In order to provent float view in Tangram overiding with them, here is a way to set an offset. ``` engine.getLayoutManager().setFixOffset(0, 40, 0, 0); ``` ## 10.Setting preload number(Option) As mentioned before, ```engine.onScrolled()``` would be trigged during the scroll of recyclerView, then engine will look for card that need load its data async. By default engine look for next 5 cards at most, users can change the number. ``` engine.setPreLoadNumber(3) ``` # 11.Load page data and bind to engine Business data always loaded from server, here we just read from asset for simplity. ``` String json = new String(getAssertsFile(this, "data.json")); JSONArray data = null; try { data = new JSONArray(json); engine.setData(data); } catch (JSONException e) { e.printStackTrace(); } ``` A complete data structure of a page could be found at [Demo](https://github.com/alibaba/Tangram-Android/tree/master/examples)'s asset。