2017-02-26 4 views
0

Ich bin Neuling für Android-Entwicklung. Ich arbeite in android studio. Ich habe einige json Dateien, die ich in meinem Ordner assets platziert habe. Jetzt möchte ich die Daten in JSON-Datei (en) in ein Spinner auffüllen. Ich weiß, wie man Spinner verwendet und Daten mit web service auffüllt, aber ich habe keine Ahnung, wie man es mit json Datei (en) macht. Außerdem konnte ich kein Tutorial finden, aber ja, ich habe how to read data from json file gefunden, aber ich möchte es in Spinner auffüllen. Unten ist eine meiner json Dateidaten.Füllen Sie Spinner mit JSON-Datei ohne Web-Service

ref.json

{"reference": 
    [ 
    {"ref_no":"11111111111111","Name":"Faisal"}, 

    {"ref_no":"22222222222222","Name":"Salman"}, 

    {"ref_no":"33333333333333","Name":"Asim"}, 

    {"ref_no":"44444444444444","Name":"Asad"}, 

    {"ref_no":"55555555555555","Name":"Mateen"}, 

    {"ref_no":"66666666666666","Name":"Omar"}, 

    {"ref_no":"77777777777777","Name":"Usama"} 

    ]} 

Unten ist mein Layout für spinner

<Spinner 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/dd_ref" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

Ich möchte ref_no von JSON-Datei erhalten und sie in den Spinner zeigen.

Update 1

Nachdem ich die Antworten zu lesen und Vorschläge, die ich die folgende

ArrayList<String> refList; 

public static final String LOG_TAG = MainActivity.class.getSimpleName(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    try { 
     loadData(); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 

public void loadData() throws JSONException { 
    JSONArray jsonArray; 
    JSONObject jobj; 


    try 
    { 
     jobj = new JSONObject(loadJSONFromAssest()); 
     jsonArray = jobj.getJSONArray("reference"); 

     for(int i = 0; i<jsonArray.length();i++) 
     { 
      jobj = jsonArray.getJSONObject(i); 
      Log.d("Details-->", jobj.getString("ref_no")); 
      String ref = jobj.getString("ref_no"); 

      refList.add(ref); 
     } 


    } catch (JSONException e) 
    { 
     e.printStackTrace(); 
    } 

    dd_ref.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, refList)); 


    dd_ref.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 

      refr_no = String.valueOf(refList.get(position)); 

      Log.i(LOG_TAG,refr_no); 

     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 

     } 
    }); 

} 

public String loadJSONFromAssest() { 

    String json = " "; 

    try{ 
     InputStream is = getAssets().open("ref.json"); 

     int size = is.available(); 

     byte[] buffer = new byte[size]; 

     is.read(buffer); 
     is.close(); 

     json = new String(buffer, "UTF-8"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 

    return json; 


} 

getan haben, wenn ich die Anwendung ausführen ich folgende Fehler

FATAL EXCEPTION: main 
                      Process: com.example.accurat.application, PID: 7336 
                      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.accurat.application/com.example.accurat.application.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2442) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2506) 
                       at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:148) 
                       at android.app.ActivityThread.main(ActivityThread.java:5491) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference 
                       at com.example.accurat.application.MainActivity.loadData(MainActivity.java:59) 
                       at com.example.accurat.application.MainActivity.onCreate(MainActivity.java:37) 
                       at android.app.Activity.performCreate(Activity.java:6270) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1130) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2395) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2506)  
                       at android.app.ActivityThread.-wrap11(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1363)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:148)  
                       at android.app.ActivityThread.main(ActivityThread.java:5491)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)  

Unterhalb der ist erhalten Bild für meine Fehlersuche

enter image description here

Der Fehler ist refList.add(ref);, da es besagt, dass refList null ist.

Ich bin dran und wusste nicht, wie es geht.

Jede Hilfe würde sehr geschätzt werden.

+0

überprüfen Sie diese http: //www.androidbegin.com/tutorial/android-populating-spinner-json-tutorial/ –

+0

Mögliches Duplikat von [Android Java; Wie kann ich eine lokale JSON-Datei vom Ordner "Assets" in eine ListView-Datei einlesen] (http://stackoverflow.com/questions/19945411/android-java-how-cani-i-parse-a-local-json-file-from- assets-folder-in-a-listvi) –

+0

@ Skizo-ozᴉʞS danke für den Kommentar, aber es verwendet eine URL und ich möchte nicht Web-Service verwenden, ich möchte nur meine lokale JSON-Datei verwenden. – faisal1208

Antwort

1

Um eine JSON-Datei aus assets Ordner laden Sie diese Methoden verwenden können:

public static JSONObject loadJsonObjectFromAsset(String assetName) { 
    try { 
     String json = loadStringFromAsset(assetName); 
     if (json != null) 
      return new JSONObject(json); 
    } catch (Exception e) { 
     Log.e("JsonUtils", e.toString()); 
    } 

    return null; 
} 

private static String loadStringFromAsset(String assetName) throws Exception { 
    InputStream is = CraveApplication.getContext().getAssets().open(assetName); 
    int size = is.available(); 
    byte[] buffer = new byte[size]; 
    is.read(buffer); 
    is.close(); 
    return new String(buffer, "UTF-8"); 
} 

und rufen Sie einfach:

JSONObject json = loadJsonObjectFromAsset("ref.json"); 

wird der zweite Schritt sein, um dieses Objekt json zu analysieren und eine Liste erstellen:

JSONObject json = loadJsonObjectFromAsset("ref.json"); 
List<String> refList = new ArrayList<>(); 
try { 
    JSONArray refArray = json.getJSONArray("reference"); 
    for(int i = 0; i< refArray.length(); i++){ 
     String ref = refArray.getJSONObject(i).getString("ref_no"); 
     refList.add(ref); 
    } 

} catch (JSONException e) { 
    e.printStackTrace(); 
} 

Und der letzte Schritt den Spinner mit der neuen Liste zu füllen sein wird, die wir erstellt haben:

Spinner spinner = (Spinner) findViewById(R.id.spinner); 
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(
     this, 
     android.R.layout.simple_spinner_dropdown_item, 
     refList); 
spinner.setAdapter(arrayAdapter); 
+0

Danke für die Antwort, ich habe bereits Ihren Code versucht, aber in einem anderen Stil, ich bekomme einen Fehler, können Sie bitte meinen aktualisierten Code sehen? – faisal1208

+0

Bevor Sie neue Elemente zu Ihrer Liste hinzufügen, müssen Sie eine neue Liste erstellen: Liste refList = new ArrayList <>(); – CookieMonster

+0

Immer noch mit dem gleichen Problem :( – faisal1208

1

versuchen diese

public void methodName() throws JSONException { 

    ArrayList<String> spinnerArray =new ArrayList<String>(); 

    final JSONArray ja = new JSONObject(loadJSONFromAsset()).getJSONArray("reference"); 

    for (int q = 0; q < ja.getJSONArray(0).length(); q++) { 
     //String name = ja.getJSONArray(0).getJSONObject(q).getString("Name"); 
     String refNo = ja.getJSONArray(0).getJSONObject(q).getString("ref_no"); 
     spinnerArray.add(refNo); 
    } 

    //set spinnerArray in spinner adapter 

} 


public String loadJSONFromAsset() { 
    String json = null; 
    try { 

     InputStream is = context_.getAssets().open("file_name.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; 

} 
+0

Ok lass mich versuchen, dann werde ich dich wissen lassen – faisal1208

+0

Ich bekomme diesen Fehler 'org.json.JSONException: Wert {" ref_no ":" 11111111111111 "," Name ":" Faisal "} bei 0 vom Typ org.json .JSONObject kann nicht in JSONArray' konvertiert werden. – faisal1208

+0

Es trifft auf Punkt 'für (int i = 0; i faisal1208

1

Sie können es tun, indem das Hinzufügen Gson Bibliothek zu Ihrem build.gradle

compile 'com.google.code.gson:gson:2.8.0' 


//Create a model class  
public class Reference 
{ 
    @SerializedName ("ref_no") 
    public String ref_no; 

    @SerializedName ("ref_no") 
    public String ref_no; 
} 

public void getListFromJsonFile() 
{ 
    Gson gson = new Gson(); 
    JsonReader reader = new JsonReader(new FileReader("file_name.json")); 
    List<Reference> data = gson.fromJson(reader, new TypeToken<List<Review>>() {}.getType()); 
} 
+0

' JsonReader reader = neuer JsonReader (neuer FileReader ("file_name.json")); 'liest er aus dem Assets-Ordner? – faisal1208

+0

Schnelle Google-Suche http://StackOverflow.com/a/4789699/1950812 – fillobotto

Verwandte Themen