繁体   English   中英

如何用列表数据填充微调器?

[英]How to fill spinner with list data?

在我的应用程序中,我有 2 个spinners ,这个spinners应该从服务器填充。
Spinner 1 是显示国家名称, Spinner 2 是显示状态
我想在每个国家/地区选择spinner 1 时, spinner 2 显示这些国家/地区的状态
我的列表数据是:

{
    "status": "success",
    "data": [
        {
        "provinces": "USA",
        "cites": [
        "New York",
        "Alabama",
        "Alaska",
        "Arizona",
        "Arkansas",
        "California",
        "Colorado",
        "Connecticut"
            ]
        },
        {
        "provinces": "German"
        "cites": [
        "Bavaria",
        "Baden-Württemberg",
        "North Rhine-Westphalia",
        "Hesse",
        "Lower Saxony",
        "Rhineland-Palatinate",
        "Thuringia",
        "Brandenburg"
            ]
        }
    ]
}

我的代码:

public class AddressActivity extends AppCompatActivity {

@BindView(R.id.spinner)
Spinner countrySpinner;
@BindView(R.id.spinner2)
Spinner citiesSpinner;

private Context context;
private String apiHash;
private List<String> countriesNameList = new ArrayList<>();
private List<String> citiesNameList = new ArrayList<>();
private ArrayAdapter<String> dataAdapter;
private ArrayAdapter<String> dataAdapter2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_address);

    context = this;
    ButterKnife.bind(this);
    apiHash = GoodPrefs.getInstance().getString(API_HASH, "");

    dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesNameList);

    callCitiesApi();
}

private void callCitiesApi() {
    ApiClient.Companion.getInstance().apisUseCase()
            .getCartCities(apiHash)
            .enqueue(new Callback<CartCitiesResponse>() {
                @Override
                public void onResponse(Call<CartCitiesResponse> call, Response<CartCitiesResponse> response) {
                    if (response.isSuccessful()) {
                        if (Objects.requireNonNull(response.body()).getStatus().equals("success")) {
                            for (int i = 0; i < response.body().getData().size(); i++) {
                                countriesNameList.add(response.body().getData().get(i).getProvinces());

                            }
                            dataAdapter.notifyDataSetChanged();
                            dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                            countrySpinner.setAdapter(dataAdapter);
                        }
                    }
                }

                @Override
                public void onFailure(Call<CartCitiesResponse> call, Throwable t) {

                }
            });
}

例如:spinner 1 选择USA 时spinner 2 显示美国的州,当spinner 1 选择German 时spinner 2 显示德国的州和......

我可以用国家名称填充spinner 1,但我不知道如何用spinner 1 更改spinner 2 项目!

我怎么能

使用onItemSelectedListener并获取如下城市:

override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {

    when (parent?.id) {
        R.id.provinceSpinner -> {
            val provinceName = provinceSpinner?.getItemAtPosition(position)

            // get cities here using provinceName
            val cities = ...

            // Fill with cities
            cityAdapter?.clear()
            cityAdapter?.addAll(cities)
            cityAdapter?.notifyDataSetChanged()
        }
    }
}

建议:首先从服务器获取所有数据并将其存储在本地数据库中。 然后在本地进行操作。

在这里完成实现:

public class AddressActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {

    @BindView(R.id.spinner)
    Spinner countrySpinner;
    @BindView(R.id.spinner2)
    Spinner citiesSpinner;

    private Context context;
    private String apiHash;
    private List<String> countriesNameList = new ArrayList<>();
    private List<String> citiesNameList = new ArrayList<>();
    Map<String, List<String>> citiesNameMapWithCountry = new HashMap<>();
    private ArrayAdapter<String> dataAdapter;
    private ArrayAdapter<String> dataAdapter2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address);

        context = this;
        ButterKnife.bind(this);
        apiHash = GoodPrefs.getInstance().getString(API_HASH, "");

        //Attach adapter to spinner here
        dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, countriesNameList);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        countrySpinner.setAdapter(dataAdapter);

        //Add listener here
        countrySpinner.setOnItemSelectedListener(this);

        //Set city spinner with adapter
        dataAdapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, citiesNameList);
        dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        citiesSpinner.setAdapter(dataAdapter2);


        callCitiesApi();
    }

    private void callCitiesApi() {
        ApiClient.Companion.getInstance().apisUseCase()
                .getCartCities(apiHash)
                .enqueue(new Callback<CartCitiesResponse>() {
                    @Override
                    public void onResponse(Call<CartCitiesResponse> call, Response<CartCitiesResponse> response) {
                        if (response.isSuccessful()) {
                            if (Objects.requireNonNull(response.body()).getStatus().equals("success")) {
                                for (int i = 0; i < response.body().getData().size(); i++) {
                                    String countryName = response.body().getData().get(i).getProvinces();
                                    countriesNameList.add(countryName);
                                    citiesNameMapWithCountry.put(countryName, response.body().getData().get(i).getCites());
                                }

                                //dataAdapter.clear();
                                //dataAdapter.addAll(countriesNameList);
                                dataAdapter.notifyDataSetChanged();
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<CartCitiesResponse> call, Throwable t) {

                    }
                });
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        if(parent.getId() == R.id.spinner) {
            String countryName = (String) countrySpinner.getItemAtPosition(position);
            citiesNameList.clear();
            citiesNameList.addAll(citiesNameMapWithCountry.get(countryName));

            //dataAdapter2.clear();
            //dataAdapter2.addAll(citiesNameList);
            dataAdapter2.notifyDataSetChanged();
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM