Cómo mostrar los elementos de archivo JSON a spinner

chichi:

Estoy tratando de mostrar una lista en una ruleta de un archivo JSON en la carpeta de activos. He encontrado un tutorial pero creo que mi formato es incorrecto, por favor, ayuda! También, será este proceso toma tiempo para cargar a la ruleta si la lista tiene un máximo de 300 elementos?

aquí es mi actividad principal

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        ArrayList<String> items = getFood("food.json");
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, R.id.txt, items);
        spinner.setAdapter(adapter);
    }

    public ArrayList<String> getBanks(String fileName) {
        JSONObject jsonObject = null;

        try {
            InputStream is = getResources().getAssets().open(fileName);
            int size = is.available();
            byte[] data = new byte[size];
            is.read(data);
            is.close();
            String json = new String(data, "UTF-8");
            jsonObject = new JSONObject(json);

            if (jsonObject != null) {
                for (int i = 0; i < jsonObject.length(); i++) {

                  JSONArray foodList = jsonObject.getJSONArray("data");
                    if(cList != null){
                        for(int j=0; i<cList.length(); j++){
                            JSONObject fList = foodList.getJSONObject(j);
                            String food_name = foodList.getString("name");
                            String food_code = foodList.getString("code");

                        }
                    }
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException je) {
            je.printStackTrace();
        }
        return cList;
    }
}

la estructura de mi respuesta, guardado como food.json

{
  "status": "Successful",
  "data": [
    {
      "code": "11",
      "id": 1,
      "name": "Apple"
    },
    {
      "code": "22",
      "id": 2,
      "name": "Carrot"
    },
    {
      "code": "33",
      "id": 3,
      "name": "Diamonds"
    },
    {
      "code": " 44",
      "id": 4,
      "name": "Eggs"
    },
   {
      "code": "55",
      "id": 5,
      "name": "Fish"
    }
  ],
  "message": "Action was successful"
}
Mjurn:

Para este uso tarea Jackson-jr (El tamaño es muy pequeño y más rápido que otras bibliotecas como Gson, Jasckson núcleo ...)

Teniendo en cuenta el rendimiento, es la mejor opción que la otra.


Ahora vamos a ir a la solución

biblioteca de Jackson-jr primera importación a su proyecto androide

implementation 'com.fasterxml.jackson.jr:jackson-jr-objects:2.10.0'

a continuación, crear dos clases del modelo como éste

public class Food {
    private String status;
    private List<Data> data;
    private String message;

    public Food() {
    }

    //getters and setters
}

public class Data {
    private String code;
    private int id;
    private String name;

    public Data() {
    }

    //getters and setters
}

objetos de datos de paso ayudan finales

import com.fasterxml.jackson.jr.ob.JSON;

private List<Data> getData() {
    List<Data> data = null;
    try {
        // give your json file as a inputstream
        //InputStream is = getResources().openRawResource(R.raw.food); 
        InputStream is = getResources().getAssets().open("food.json");
        Food bean = JSON.std.beanFrom(Food.class, is);
        data = bean.getData();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return data;
}

Puede hacer lo que después de que el uso de esta lista de datos ...


Para pasar sólo los nombres de los alimentos

Hay un montón de maneras. Aquí es una forma sencilla

en su onCreateutilización método siguiente código

    List<Data> data = getData();
    List<String> foodNames = getFoodNamesFromData(data);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_layout, R.id.txt, foodNames);
    // Your usual codes

Y aquí está el getFoodNamesFromData()método

private List<String> getFoodNamesFromData(List<Data> dataList) {
    List<String> foodNames = new ArrayList<>();

    for(Data data :dataList){
        String foodName = data.getName();
        foodNames.add(foodName);
    }

    return foodNames;
}

codificación feliz !!!

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=339271&siteId=1
Recomendado
Clasificación