Ich entwickle gerade eine Physik-App, die eine Liste von Formeln anzeigen und sogar einige davon lösen soll (das einzige Problem ist das ListView
)
Dies ist mein Hauptlayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:measureWithLargestChild="false"
android:orientation="vertical"
tools:context=".CatList" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/titlebar" >
<TextView
android:id="@+id/Title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="@string/app_name"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#ff1c00"
android:textIsSelectable="false" />
</RelativeLayout>
<ListView
android:id="@+id/listFormulas"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
Und das ist meine Haupttätigkeit
package com.wildsushii.quickphysics;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.view.Menu;
import android.widget.ListView;
public class CatList extends Activity {
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);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cat_list);
ListView categoriesL = (ListView)findViewById(R.id.listFormulas);
ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();
Context context = null;
try {
String jsonLocation = AssetJSONFile("formules.json", context);
JSONObject formArray = (new JSONObject()).getJSONObject("formules");
String formule = formArray.getString("formule");
String url = formArray.getString("url");
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
//My problem is here!!
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.cat_list, menu);
return true;
}
}
Ich weiß tatsächlich, dass ich dies ohne JSON schaffen kann, aber ich brauche mehr Übung beim Parsen von JSON. Dies ist übrigens der JSON
{
"formules": [
{
"formule": "Linear Motion",
"url": "qp1"
},
{
"formule": "Constant Acceleration Motion",
"url": "qp2"
},
{
"formule": "Projectile Motion",
"url": "qp3"
},
{
"formule": "Force",
"url": "qp4"
},
{
"formule": "Work, Power, Energy",
"url": "qp5"
},
{
"formule": "Rotary Motion",
"url": "qp6"
},
{
"formule": "Harmonic Motion",
"url": "qp7"
},
{
"formule": "Gravity",
"url": "qp8"
},
{
"formule": "Lateral and Longitudinal Waves",
"url": "qp9"
},
{
"formule": "Sound Waves",
"url": "qp10"
},
{
"formule": "Electrostatics",
"url": "qp11"
},
{
"formule": "Direct Current",
"url": "qp12"
},
{
"formule": "Magnetic Field",
"url": "qp13"
},
{
"formule": "Alternating Current",
"url": "qp14"
},
{
"formule": "Thermodynamics",
"url": "qp15"
},
{
"formule": "Hydrogen Atom",
"url": "qp16"
},
{
"formule": "Optics",
"url": "qp17"
},
{
"formule": "Modern Physics",
"url": "qp18"
},
{
"formule": "Hydrostatics",
"url": "qp19"
},
{
"formule": "Astronomy",
"url": "qp20"
}
]
}
Ich habe viele Dinge ausprobiert und sogar das gesamte Projekt gelöscht, um ein neues zu erstellen :(
Antworten:
Wie Faizan in ihrer Antwort hier beschreibt :
Lesen Sie zunächst die Json-Datei aus Ihrer Assests-Datei mit dem folgenden Code.
und dann können Sie einfach diese Zeichenfolge lesen, die von dieser Funktion als zurückgegeben wird
und benutze diese Methode so
Weitere Details zu JSON finden Sie HIER
quelle
m_li.put("formula", formula);
sollte es seinm_li.put("formula", formula_value);
und sollte mit seinLog
statt System.out.printinWas machst du
Also wechseln Sie zu
Zu analysieren
Ich glaube, Sie bekommen die Zeichenfolge aus dem Assests-Ordner.
quelle
Mit Kotlin haben Sie diese Erweiterungsfunktion, um die Dateirückgabe als String zu lesen.
fun AssetManager.readAssetsFile(fileName : String): String = open(fileName).bufferedReader().use{it.readText()}
Analysieren Sie die Ausgabezeichenfolge mit einem beliebigen JSON-Parser.
quelle
Methode zum Lesen der JSON-Datei aus dem Ordner "Assets" und zum Zurückgeben als Zeichenfolgenobjekt.
Nun zum Parsen von Daten in Ihrer Aktivität: -
quelle
Quellcode So rufen Sie Local Json aus dem Ordner "Assets" ab
https://drive.google.com/open?id=1NG1amTVWPNViim_caBr8eeB4zczTDK2p
quelle
Mit Okio
und dann...
quelle
Wenn Sie Kotlin in Android verwenden, können Sie eine Erweiterungsfunktion erstellen .
Erweiterungsfunktionen werden außerhalb einer Klasse definiert - sie verweisen jedoch auf den Klassennamen und können verwendet werden
this
. In unserem Fall verwenden wirapplicationContext
.In der Utility-Klasse können Sie also alle Erweiterungsfunktionen definieren.
Utility.kt
MainActivity.kt
Sie können die private Funktion zum Laden von JSON-Daten wie folgt definieren:
Sie müssen
facilityModelList
Ihre übergebenListView
FacilityModel.kt
In meinem Fall beginnt die JSON-Antwort mit JSONArray
quelle
Fassen Sie einfach die Antwort von @ libing mit einem Beispiel zusammen, das für mich funktioniert hat.
private fun AssetManager.readAssetsFile(fileName : String): String = open(fileName).bufferedReader().use{it.readText()}
Ohne diese Erweiterungsfunktion kann das gleiche erreicht werden durch Einsatz
BufferedReader
undInputStreamReader
diese Art und Weise:quelle