[英]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.