alibaba / Tangram-Android

Tangram is a modular UI solution for building native page dynamically including Tangram for Android, Tangram for iOS and even backend CMS. This project provides the sdk on Android.

Home Page:http://tangram.pingguohe.net/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

我想在不改变服务端json数据的情况下用现有的数据,动态new Card然后调用setData(List<Card> data),有相关的教程么?

coderloveryan opened this issue · comments

我想在不改变服务端json数据的情况下用现有的数据,动态new Card然后调用setData(List data),有相关的教程么?

以下是我写的测试代码,但是我发现卡品显示不出来,原因是setCells方法内部调用addCellInternal方法时, MVHelper mvHelper = getMVHelper();中mvHelper为空mvHelper为空时因为getMVHelper()方法中serviceManager为空。造成setCells虽然调用了但是Card中的mCells集合是空的所以没有显示。
public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private Button btnLogin;
private Button btnUnLogin;
TangramEngine engine;
TangramBuilder.InnerBuilder builder;
private SingleColumnCard unLoginCard;
private SingleColumnCard loginCard;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    recyclerView = findViewById(R.id.recyclerView);
    btnLogin = findViewById(R.id.btn_login);
    btnUnLogin = findViewById(R.id.btn_unlogin);
    TangramBuilder.init(this.getApplicationContext(), new IInnerImageSetter() {
        @Override
        public <IMAGE extends ImageView> void doLoadImageUrl(@NonNull IMAGE view,
                                                             @Nullable String url) {
            Glide.with(MainActivity.this).load(url).into(view);
        }
    }, ImageView.class);
    this.builder = TangramBuilder.newInnerBuilder(this);
    this.builder.registerCell("unlogin", UnLoginCell.class, UnLoginView.class);
    this.builder.registerCell("login", LoginCell.class, LoginView.class);
    engine = this.builder.build();
    engine.bindView(recyclerView);
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            engine.onScrolled();
        }
    });
    engine.setPreLoadNumber(3);
    List<Card> cards = new ArrayList<>();
    initUnLoginCard();
    initLoginCard();
    cards.add(unLoginCard);
    engine.setData(cards);
    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            engine.replace(unLoginCard, loginCard);
        }
    });
    btnUnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            engine.replace(loginCard, unLoginCard);
        }
    });
}

private void initLoginCard() {
    loginCard = new SingleColumnCard();
    LoginCell loginCell = new LoginCell();
    ArrayList<BaseCell> loginCellList = new ArrayList<>();
    loginCellList.add(loginCell);
    loginCard.setCells(loginCellList);
}

private void initUnLoginCard() {
    unLoginCard = new SingleColumnCard();
    UnLoginCell unLoginCell = new UnLoginCell();
    ArrayList<BaseCell> unLoginCellList = new ArrayList<>();
    unLoginCellList.add(unLoginCell);
    unLoginCell.setStringType("unlogin");
    unLoginCard.setCells(unLoginCellList);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    engine.destroy();
}

}

没人回复,我现在做法是拉取服务端数据成功后然后app本地按照Tangram格式重新组织一份新的包含布局以及服务端数据的json数据,最后setData(JsonArray)