我想在不改变服务端json数据的情况下用现有的数据,动态new Card然后调用setData(List<Card> data),有相关的教程么?
coderloveryan opened this issue · comments
coderloveryan commented
我想在不改变服务端json数据的情况下用现有的数据,动态new Card然后调用setData(List data),有相关的教程么?
coderloveryan commented
以下是我写的测试代码,但是我发现卡品显示不出来,原因是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();
}
}
coderloveryan commented
没人回复,我现在做法是拉取服务端数据成功后然后app本地按照Tangram格式重新组织一份新的包含布局以及服务端数据的json数据,最后setData(JsonArray)