2016-07-05 51 views
5
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 我想創建一個下拉菜單,從JSON文件,該文件是在我的項目的數據。我一直在努力通過soapui來訪問我的遠程服務器,所以我將.json文件複製到資產下的項目中。該代碼不會給我一個錯誤,但我的應用程序不會運行。我認爲問題在於如何打開.json文件或如何訪問對象。創建一個下拉菜單,從以.json文件

預先感謝您。

+0

你是什麼意思,應用程序將無法運行?它是否會因異常而崩潰,或者您的列表沒有填充?如果崩潰,請發佈您的LogCat。 – Rohan

+0

對不起,我的意思是它不會做我想做的事,那就是創建下拉菜單,並用.json文件中的內容填充它。 – che

+0

當我創建一個正常的字符串數組時,它確實創建了下拉菜單,當我按下按鈕。找到它是非常困難的android一般調試.. – che

回答

0

您可以嘗試以下函數爲您的JSON文件獲取字符串。

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); 
    } 

然後解析它。 如果數據足夠大,我會推薦使用一些庫(如LoganSquare或Jackson)來解析JSON數據。

0

您必須確保您的應用程序從Json文件中正確讀取。以下是工作代碼:

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; 
} 
} 

和佈局:

<?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> 

和JSON文件夾資產:

{ 
    "formules": [ 
      { 
    "formule": "Linear Motion", 

}, 
{ 
    "formule": "Constant Acceleration Motion", 

}, 
{ 
    "formule": "Projectile Motion", 

}, 
{ 
    "formule": "Force", 

}, 
{ 
    "formule": "Work, Power, Energy", 

}, 

] 
}