【问题标题】:How to create dynamically class in Android如何在Android中动态创建类
【发布时间】:2019-11-25 01:43:49
【问题描述】:

在我的应用程序中,我应该使用Material Stepper,为此,我想使用这个https://github.com/ernestoyaquello/VerticalStepperForm

但我想从服务器动态添加此内容。
为了与服务器连接,我使用了 Retrofit 库,我应该检查服务器中的项目类型。

当此类型为“penny”时,显示其中一个步骤,当类型为“best”时,显示另一个步骤。

我从库教程中创建了这个步骤,但我希望当类型为 penny 时显示 StepDynamicTxt 并且当类型为 best 时显示我StepDynamicEdt

我编写了以下代码,但只添加了每一步中的一项!
但在 API 中,我有 2 项便士类型和 3 项最佳类型!

应该显示 5 步,但显示 2 步!

我的代码:

public class StepperActivity extends AppCompatActivity {

    private ApiServices apiServices;
    private ProgressBar loader;
    private VerticalStepperFormView stepper;

    private StepDynamicEdt stepDynamicEdt;
    private StepDynamicTxt stepDynamicTxt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bidzila_stepper);
        //Initialize
        apiServices = ApiClient.ApiClient().create(ApiServices.class);
        loader = findViewById(R.id.bidStepper_loader);
        stepper = findViewById(R.id.bidStepper);

        //Api
        callAPi();
    }

    private void callAPi() {
        loader.setVisibility(View.VISIBLE);
        Call<TodayResponse> call = apiServices.TODAY_RESPONSE_CALL(5);
        call.enqueue(new Callback<TodayResponse>() {
            @Override
            public void onResponse(Call<TodayResponse> call, Response<TodayResponse> response) {
                if (response.isSuccessful()) {
                    if (response.body() != null) {
                        if (response.body().getRes() != null) {
                            if (response.body().getRes().getToday().size() > 0) {
                                loader.setVisibility(View.GONE);
                                //Foreach
                                for (int i = 0; i < response.body().getRes().getToday().size(); i++) {

                                    if (response.body().getRes().getToday().get(i).getType().equals("penny")) {

                                        stepDynamicEdt = new StepDynamicEdt(response.body().getRes().getToday().get(i).getName());

                                    } else if (response.body().getRes().getToday().get(i).getType().equals("best")) {

                                        stepDynamicTxt = new StepDynamicTxt(response.body().getRes().getToday().get(i).getName());
                                    }
                                }

                                stepper.setup(new StepperFormListener() {
                                    @Override
                                    public void onCompletedForm() {

                                    }

                                    @Override
                                    public void onCancelledForm() {

                                    }
                                }, stepDynamicEdt, stepDynamicTxt)
                                        .allowNonLinearNavigation(false)
                                        .displayCancelButtonInLastStep(false)
                                        .displayBottomNavigation(false)
                                        .confirmationStepTitle("Confirm")
                                        .stepNextButtonText("Continue")
                                        .lastStepNextButtonText("Finish")
                                        .includeConfirmationStep(false)
                                        .init();
                            }
                        }
                    }
                }
            }

            @Override
            public void onFailure(Call<TodayResponse> call, Throwable t) {
                Log.e("ResponseErr", t.getMessage());
            }
        });
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
    }
}

我认为此行的问题是:}, stepDynamicEdt, stepDynamicTxt) 因为只需添加 2 步。

如何在 Android 中动态添加此步骤?

【问题讨论】:

  • 根据需要多次创建它们,然后将它们存储在 Step 类型的数组中,最后将该数组传递给 setup 调用。 github.com/ernestoyaquello/VerticalStepperForm/blob/master/…
  • @TejashwiKalpTaru,你能把我上面的代码发给我吗?因为我是业余爱好者,我真的需要你的帮助。请帮帮我

标签: java android uistepper stepper


【解决方案1】:

在您的代码中,您犯了一个非常根本的错误。也就是说,您每次在循环中都使用相同的变量来存储动态编辑类型和动态文本类型,这将替换任何以前创建的字段。因此,当您最终创建它们时,您最终会得到每种类型的最后一个值。

您可以做的是,创建一个类型为Step 的列表,每次获取它们时添加新类型,最后将该列表传递给构建器。

The builder accepts a list too, you should check implementation when its open source.

// before the for loop, create a list of type Step
List<Step> steps = new ArrayList();
// your loop on response received from server
for (int i = 0; i < response.body().getRes().getToday().size(); i++) {
    if (response.body().getRes().getToday().get(i).getType().equals("penny")) {
        StepDynamicEdt stepDynamicEdt = new StepDynamicEdt(response.body().getRes().getToday().get(i).getName());
        // add to list
        steps.add(stepDynamicEdt);
    } else if (response.body().getRes().getToday().get(i).getType().equals("best")) {
        StepDynamicTxt stepDynamicTxt = new StepDynamicTxt(response.body().getRes().getToday().get(i).getName());
        // add to list
        steps.add(stepDynamicTxt);
    }
}
// finally create them
stepper.setup(new StepperFormListener() {
    @Override
    public void onCompletedForm() {

    }

    @Override
    public void onCancelledForm() {

    }
}, steps) // pass the list
        .allowNonLinearNavigation(false)
        .displayCancelButtonInLastStep(false)
        .displayBottomNavigation(false)
        .confirmationStepTitle("Confirm")
        .stepNextButtonText("Continue")
        .lastStepNextButtonText("Finish")
        .includeConfirmationStep(false)
        .init();

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 2018-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多