2016-07-05 58 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", 

}, 

] 
}