Немного странная проблема здесь. В настоящее время у меня есть действие, которое получает имена и идентификаторы мест всех компаний такси с помощью API поиска Google Адресов и помещает их в список. Затем при щелчке элемента он получает идентификатор места и запускает API сведений о местах, чтобы получить номер телефона.
В настоящее время я сталкиваюсь с проблемой, когда при первом нажатии элемента в списке просмотра отображается JSON парсер вернет NULL и телефон наберет номер, например 6855 или 685-5. Если вы go вернетесь и нажмете на тот же элемент или другой элемент, тогда номер телефона будет выбран правильно.
В упражнении я использую 2 JSON парсеров, однако они запускаются в разное время.
onCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_taxi);
mQueue = Volley.newRequestQueue(this);
pQueue = Volley.newRequestQueue(this);
listItem = new ArrayList<>();
placeid = new ArrayList<>();
police = findViewById(R.id.textView11);
userlist = findViewById(R.id.users_list);
jsonParse();
userlist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String phone = jsonParseNumber(position);
}
});
}
jsonParse (локально получает имена компаний такси)
private void jsonParse() {
String url = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=51.6232817,0.2919483&radius=1000&type=taxi%20service&keyword=taxi&key=APIKEY";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++){
JSONObject result = jsonArray.getJSONObject(i);
String name = result.getString("name");
String id = result.getString("place_id");
placeid.add(id);
listItem.add(name);
}
adapter = new ArrayAdapter(Taxi.this, R.layout.row, listItem);
userlist.setAdapter(adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(request);
}
jsonParseNumber (получает номер и вызывает его - это код, который возвращает NULL, когда он запускается в первый раз)
private String jsonParseNumber(int pos) {
String id = placeid.get(pos);
String url = "https://maps.googleapis.com/maps/api/place/details/json?placeid="+id+"&key=APIKEY";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONObject jsonArray = response.getJSONObject("result");
for (int i = 0; i < jsonArray.length(); i++){
number = jsonArray.getString("formatted_phone_number");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
pQueue.add(request);
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel: " + number));
startActivity(intent);
return number;
}
Сначала я подумал, что это может быть вызвано тем, что Dial Action вызывается до завершения Parser, поэтому я переместил его в конец jsonParseNumber, чтобы убедиться, что он все еще работает то же самое.
Быстрые заметки:
2 JSON Парсеры в действии
1-й парсер получает JSON из API поиска Google PLACES для получения имен и идентификатора места такси компании в области
2-ой парсер использует идентификатор места, чтобы получить JSON из ДЕТАЛЕЙ GOOGLE PLACES для получения номера телефона
При запуске 2-го парсера он вернет NULL на первый забег однако при повторном вызове он вернет номер телефона и наберет его.