Actualmente estoy desarrollando una aplicación de física que se supone que muestra una lista de fórmulas e incluso resuelve algunas de ellas (el único problema es el ListView
)
Este es mi diseño principal
<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>
Y esta es mi actividad principal.
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;
}
}
De hecho, sé que puedo hacer esto sin usar JSON, pero necesito más práctica para analizar JSON. Por cierto, este es el 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"
}
]
}
He intentado muchas cosas e incluso elimino todo el proyecto para crear uno nuevo :(
Respuestas:
Como Faizan describe en su respuesta aquí :
En primer lugar, lea el archivo Json de su archivo de evaluaciones utilizando el código a continuación.
y luego simplemente puede leer este retorno de cadena por esta función como
y usar este método así
Para más detalles sobre JSON, lea AQUÍ
fuente
m_li.put("formula", formula);
deberíam_li.put("formula", formula_value);
y debería usarse enLog
lugar de System.out.printlnQué estás haciendo
Entonces cambia a
Analizar
Creo que obtienes la cadena de la carpeta de evaluaciones.
fuente
Con Kotlin tiene esta función de extensión para leer el archivo devuelto como cadena.
fun AssetManager.readAssetsFile(fileName : String): String = open(fileName).bufferedReader().use{it.readText()}
Analiza la cadena de salida usando cualquier analizador JSON.
fuente
Método para leer el archivo JSON de la carpeta Assets y devolverlo como un objeto de cadena.
Ahora para analizar datos en su actividad: -
fuente
Código fuente Cómo obtener Json local de la carpeta Activos
https://drive.google.com/open?id=1NG1amTVWPNViim_caBr8eeB4zczTDK2p
fuente
Usando OKIO
y entonces...
fuente
Simplemente resumiendo la respuesta de @ libing con una muestra que funcionó para mí.
private fun AssetManager.readAssetsFile(fileName : String): String = open(fileName).bufferedReader().use{it.readText()}
Sin esta función de extensión, se puede lograr lo mismo usando
BufferedReader
y deInputStreamReader
esta manera:fuente
Si está utilizando Kotlin en Android, puede crear la función de extensión .
Las funciones de extensión se definen fuera de cualquier clase; sin embargo, hacen referencia al nombre de la clase y pueden usarse
this
. En nuestro caso usamosapplicationContext
.Entonces, en la clase de utilidad, puede definir todas las funciones de extensión.
Utility.kt
MainActivity.kt
Puede definir una función privada para cargar datos JSON desde una afirmación como esta:
Tienes que pasar
facilityModelList
tuListView
FacilityModel.kt
En mi caso, la respuesta JSON comienza con JSONArray
fuente