#android #json #listview #android-volley
#Android #json #listview #android-volley
Вопрос:
Добрый день,
Я пытаюсь использовать синглтон для извлечения и заполнения ListView для приложения Android с использованием Android Studio с последней версией Volley, и у меня возникают проблемы, когда мне нужно отобразить информацию.
JSON, который я получаю с моего сервера, в порядке, и когда я создаю продукт, все кажется прекрасным, но ListView не заполнен.
Можете ли вы показать мне немного света? Я перепробовал множество руководств и примеров, и я не знаю, что мой ListView по-прежнему пуст, потому что я проверил, что продукты созданы в моей функции.
Вот вам мой код:
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ListadoProductos extends Activity {
// URL of object to be parsed
String url = "https://www.mywebsite.com/products.json";
// Key JSON
String key = "lista_productos";
// Map
List<Map<String,String>> productoList = new ArrayList<Map<String,String>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.products);
// Get the latest products
initJSON();
// Show the information
ListView listView = (ListView) findViewById(R.id.listv);
SimpleAdapter simpleAdapter = new SimpleAdapter(this, productoList, android.R.layout.simple_list_item_1, new String[] {key}, new int[] {android.R.id.text1});
listView.setAdapter(simpleAdapter);
}
private HashMap<String, String> createProducto(String nameTitle, String name){
HashMap<String, String> employeeNameNo = new HashMap<String, String>();
employeeNameNo.put(nameTitle, name);
return employeeNameNo;
}
private void initJSON(){
JsonObjectRequest jsObjRequest = new JsonObjectRequest (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try{
JSONObject jsonResponse = new JSONObject(response.toString());
JSONArray jsonMainNode = jsonResponse.optJSONArray(key);
// Show 10 products
for(int i = 0; i<10;i ){
JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
String name = jsonChildNode.getString("nombre");
String outPut = name;
productoList.add(createProducto(key, outPut));
}
}
catch(JSONException e) {
Toast.makeText(getApplicationContext(), "Error" e.toString(), Toast.LENGTH_SHORT).show();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Auto-generated method stub
Log.d("Error", error.toString());
}
});
// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);
}
}
Очень признателен.
Ответ №1:
вызов сервера не находится в MainThread, поэтому при инициализации SimpleAdapter список продуктов, вероятно, пуст, вам нужно инициализировать адаптер в методе onResponce, поэтому просто переместите
SimpleAdapter simpleAdapter = new SimpleAdapter(this, productoList, android.R.layout.simple_list_item_1, new String[] {key}, new int[] {android.R.id.text1});
listView.setAdapter(simpleAdapter);
для вашего метода onResponse (JSONObject response)
Комментарии:
1. Привет @Farid, я пытался переместить его, но он показывает следующую ошибку: Ошибка: (109, 69) ошибка: несовместимые типы: <анонимный слушатель<JSONObject>> не может быть преобразован в контекст
2. вместо «this» используйте «ListadoProductos.this»