Android 微调器不显示文本和选中时
Android Spinner Not Showing Text and When Selected
我使用来自 json 的适配器数据创建微调器。但是为什么微调器不显示文本并且在选择值时不显示。有人可以帮助我。
旋转器
<Spinner android:id="@+id/spinCity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="15dp"
android:textColor = "#000000"
android:prompt="@string/city_prompt"
/>
为微调器加载 json。
cityItems = new ArrayList<City>();
cityNames = new ArrayList<String>();
JsonObjectRequest jsonReq = new JsonObjectRequest(
AppConfig.URL_CITY, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
VolleyLog.d(TAG, "Response: " + response.toString());
if (response != null) {
try {
JSONArray feedArray = response.getJSONArray("result");
for (int i = 0; i < feedArray.length(); i++) {
JSONObject feedObj = (JSONObject) feedArray.get(i);
City item = new City();
item.setId(feedObj.getInt("id"));
item.setCity(feedObj.getString("city"));
cityItems.add(item);
cityNames.add(feedObj.getString("city"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
String credentials = AppConfig.USER_API+":"+AppConfig.PASSWORD_API;
String auth = "Basic "
+ Base64.encodeToString(credentials.getBytes(),
Base64.NO_WRAP);
headers.put("Authorization", auth);
return headers;
}
};
VolleyController.getInstance().addToRequestQueue(jsonReq);
spinCity = (Spinner) findViewById(R.id.spinCity);
ArrayAdapter<String> cAdapter = new ArrayAdapter<String>
(SendReportActivity.this, android.R.layout.simple_spinner_item, cityNames);
cAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinCity.setAdapter(cAdapter);
spinCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(),
"selected", Toast.LENGTH_LONG)
.show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
这是我 运行 时的屏幕截图。
Spinner
很可能不知道添加到您的 Response.Listener
中的数据。
你需要做类似的事情
Spinner s = (Spinner) findViewById(R.id.spinCity);
BaseAdapter a = (BaseAdapter) s.getAdapter();
if (a != null)
a.notifyDataSetChanged();
在 for 循环之后你调用 cityNames.add(feedObj.getString("city"))
in.
因为第一次你的 cityNames
是空的,它需要在收到响应数据后刷新。所以,你需要调用notifyDataSetChanged()
来更新数据。
cityItems = new ArrayList<City>();
cityNames = new ArrayList<String>();
**final ArrayAdapter<String> cAdapter = new ArrayAdapter<String>
(SendReportActivity.this, android.R.layout.simple_spinner_item, cityNames);**
JsonObjectRequest jsonReq = new JsonObjectRequest(
AppConfig.URL_CITY, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
VolleyLog.d(TAG, "Response: " + response.toString());
if (response != null) {
try {
JSONArray feedArray = response.getJSONArray("result");
for (int i = 0; i < feedArray.length(); i++) {
JSONObject feedObj = (JSONObject) feedArray.get(i);
City item = new City();
item.setId(feedObj.getInt("id"));
item.setCity(feedObj.getString("city"));
cityItems.add(item);
cityNames.add(feedObj.getString("city"));
}
**cAdapter.notifyDataSetChanged();**
} catch (JSONException e) {
e.printStackTrace();
}
}
...
我使用来自 json 的适配器数据创建微调器。但是为什么微调器不显示文本并且在选择值时不显示。有人可以帮助我。
旋转器
<Spinner android:id="@+id/spinCity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="15dp"
android:textColor = "#000000"
android:prompt="@string/city_prompt"
/>
为微调器加载 json。
cityItems = new ArrayList<City>();
cityNames = new ArrayList<String>();
JsonObjectRequest jsonReq = new JsonObjectRequest(
AppConfig.URL_CITY, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
VolleyLog.d(TAG, "Response: " + response.toString());
if (response != null) {
try {
JSONArray feedArray = response.getJSONArray("result");
for (int i = 0; i < feedArray.length(); i++) {
JSONObject feedObj = (JSONObject) feedArray.get(i);
City item = new City();
item.setId(feedObj.getInt("id"));
item.setCity(feedObj.getString("city"));
cityItems.add(item);
cityNames.add(feedObj.getString("city"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d(TAG, "Error: " + error.getMessage());
}
}){
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = new HashMap<String, String>();
String credentials = AppConfig.USER_API+":"+AppConfig.PASSWORD_API;
String auth = "Basic "
+ Base64.encodeToString(credentials.getBytes(),
Base64.NO_WRAP);
headers.put("Authorization", auth);
return headers;
}
};
VolleyController.getInstance().addToRequestQueue(jsonReq);
spinCity = (Spinner) findViewById(R.id.spinCity);
ArrayAdapter<String> cAdapter = new ArrayAdapter<String>
(SendReportActivity.this, android.R.layout.simple_spinner_item, cityNames);
cAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinCity.setAdapter(cAdapter);
spinCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(),
"selected", Toast.LENGTH_LONG)
.show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
这是我 运行 时的屏幕截图。
Spinner
很可能不知道添加到您的 Response.Listener
中的数据。
你需要做类似的事情
Spinner s = (Spinner) findViewById(R.id.spinCity);
BaseAdapter a = (BaseAdapter) s.getAdapter();
if (a != null)
a.notifyDataSetChanged();
在 for 循环之后你调用 cityNames.add(feedObj.getString("city"))
in.
因为第一次你的 cityNames
是空的,它需要在收到响应数据后刷新。所以,你需要调用notifyDataSetChanged()
来更新数据。
cityItems = new ArrayList<City>();
cityNames = new ArrayList<String>();
**final ArrayAdapter<String> cAdapter = new ArrayAdapter<String>
(SendReportActivity.this, android.R.layout.simple_spinner_item, cityNames);**
JsonObjectRequest jsonReq = new JsonObjectRequest(
AppConfig.URL_CITY, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
VolleyLog.d(TAG, "Response: " + response.toString());
if (response != null) {
try {
JSONArray feedArray = response.getJSONArray("result");
for (int i = 0; i < feedArray.length(); i++) {
JSONObject feedObj = (JSONObject) feedArray.get(i);
City item = new City();
item.setId(feedObj.getInt("id"));
item.setCity(feedObj.getString("city"));
cityItems.add(item);
cityNames.add(feedObj.getString("city"));
}
**cAdapter.notifyDataSetChanged();**
} catch (JSONException e) {
e.printStackTrace();
}
}
...