Creating a dropdown menu from a .json file

package com.example.root.myapplication; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import org.json.JSONArray; import org.json.JSONException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { Button btnCommercial; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ListView list11 = (ListView) findViewById(R.id.listView1); ArrayList<String> authorities = getAuthorities("AuthorityList.json"); final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, authorities); btnCommercial = (Button) findViewById(R.id.btnCommercial); btnCommercial.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { list11.setAdapter(adapter); } }); } private ArrayList<String> getAuthorities(String fileName) { JSONArray jsonArray = null; ArrayList<String> AuthList = new ArrayList<String>(); try { InputStream inputStream = getAssets().open(fileName); //open the inputStream to the file int size = inputStream.available(); //size of the entire json object byte[] data = new byte[size]; //array that will store all the data inputStream.read(data); //reading data into the array for the file inputStream.close(); //close the input steam String json = new String(data, "UTF-8"); jsonArray = new JSONArray(json); if (jsonArray != null) { for (int i = 0; i < jsonArray.length(); i++) { AuthList.add(jsonArray.getJSONObject(i).getString("description")); } } } catch (IOException e) { e.printStackTrace(); return null; } catch (JSONException je) { je.printStackTrace(); return null; } return AuthList; } } 

enter image description here I want to create a drop-down menu with data from a JSON file that is in my project. I tried to access the remote server through soapui, so I copied the .json file to my project under assets. The code does not give me an error, but my application will not work. I think the problem is how I open the .json file or how I access objects.

Thanks in advance.

+5
source share
2 answers

You can try the following function to get a string for your JSON file.

 public static String AssetJSONFile (String filename, Context context) throws IOException { AssetManager manager = context.getAssets(); InputStream file = manager.open(filename); byte[] formArray = new byte[file.available()]; file.read(formArray); file.close(); return new String(formArray); } 

and then analyze it. I would recommend using some libraries (e.g. LoganSquare or Jackson) to analyze JSON data if your data is large enough.

0
source

You must ensure that your application reads the Json file correctly. Below is the working code:

 package com.example.a386019.spinnerjson; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.Spinner; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; public class SpinnerActivity extends AppCompatActivity { String json_string; JSONObject jsonObj; JSONArray jsonArray; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_spinner); json_string= loadJSONFromAsset(); ArrayList<String> messages = new ArrayList<String>(); { try { jsonObj =new JSONObject(json_string); jsonArray =jsonObj.getJSONArray("formules"); String formule,url; for (int i = 0; i < jsonArray.length(); i++){ JSONObject jObj = jsonArray.getJSONObject(i); formule= jObj.getString("formule"); messages.add(formule); } } catch (JSONException e) { e.printStackTrace(); } } ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, messages); Spinner spinner = (Spinner)findViewById(R.id.spinner); spinner.setAdapter(adapter); } public String loadJSONFromAsset() { String json = null; try { InputStream is = getAssets().open("formules.json"); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); json = new String(buffer, "UTF-8"); } catch (IOException ex) { ex.printStackTrace(); return null; } return json; } } 

and layout:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.a386019.spinnerjson.SpinnerActivity"> <Spinner android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/spinner" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="42dp" /> </RelativeLayout> 

and json file in ASSETS folder:

  { "formules": [ { "formule": "Linear Motion", }, { "formule": "Constant Acceleration Motion", }, { "formule": "Projectile Motion", }, { "formule": "Force", }, { "formule": "Work, Power, Energy", }, ] } 
0
source

All Articles