Je développe actuellement une application de physique censée afficher une liste de formules et même en résoudre certaines (le seul problème est le ListView
)
Ceci est ma mise en page principale
<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>
Et c'est mon activité principale
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;
}
}
Je sais en fait que je peux faire cela sans utiliser JSON, mais j'ai besoin de plus de pratique pour analyser JSON. Au fait, c'est le 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"
}
]
}
J'ai essayé beaucoup de choses et même supprimé tout le projet pour en créer un nouveau :(
Réponses:
Comme Faizan le décrit dans sa réponse ici :
Tout d'abord, lisez le fichier Json à partir de votre fichier d'assests en utilisant le code ci-dessous.
et ensuite vous pouvez simplement lire cette chaîne de retour par cette fonction comme
et utilisez cette méthode comme ça
Pour plus de détails sur JSON, lisez ICI
la source
m_li.put("formula", formula);
devrait également êtrem_li.put("formula", formula_value);
et devrait être utilisé à laLog
place de System.out.printlnQue fais tu
Alors changez pour
Pour analyser
Je crois que vous obtenez la chaîne du dossier assests.
la source
Avec Kotlin, cette fonction d'extension permet de lire le fichier renvoyé sous forme de chaîne.
fun AssetManager.readAssetsFile(fileName : String): String = open(fileName).bufferedReader().use{it.readText()}
Analysez la chaîne de sortie à l'aide de n'importe quel analyseur JSON.
la source
Méthode pour lire le fichier JSON à partir du dossier Assets et le renvoyer sous forme d'objet chaîne.
Maintenant, pour analyser les données de votre activité: -
la source
Code source Comment récupérer le Json local à partir du dossier Assets
https://drive.google.com/open?id=1NG1amTVWPNViim_caBr8eeB4zczTDK2p
la source
Utiliser OKIO
puis...
la source
Je résume simplement la réponse de @ libing avec un échantillon qui a fonctionné pour moi.
private fun AssetManager.readAssetsFile(fileName : String): String = open(fileName).bufferedReader().use{it.readText()}
Sans cette fonction d'extension, la même chose peut être obtenue en utilisant
BufferedReader
et deInputStreamReader
cette manière:la source
Si vous utilisez Kotlin sous Android, vous pouvez créer une fonction d'extension .
Les fonctions d'extension sont définies en dehors de toute classe - pourtant elles font référence au nom de la classe et peuvent utiliser
this
. Dans notre cas, nous utilisonsapplicationContext
.Ainsi, dans la classe Utility, vous pouvez définir toutes les fonctions d'extension.
Utility.kt
MainActivity.kt
Vous pouvez définir une fonction privée pour charger les données JSON à partir d'assert comme ceci:
Vous devez passer
facilityModelList
votreListView
FacilityModel.kt
Dans mon cas, la réponse JSON commence par JSONArray
la source