如何在 Android 中动态创建 class

How to create dynamically class in Android

在我的申请中,我应该使用Material Stepper and for this, I want to use this library : https://github.com/ernestoyaquello/VerticalStepperForm

但我想从服务器动态添加这个
为了与服务器连接,我使用了 Retrofit 库,我应该检查来自服务器的项目类型。

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

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

我写了下面的代码,但只添加了每一步中的一项!
但是在API,我有2个penny类型的和3个best类型的!

应该显示 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 的列表,每次获取它们时添加新类型,最后将该列表传递给构建器。

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();