2012-09-28 13 views
7

Soy completamente nuevo en Android y actualmente estoy tratando de generar una vista de lista de la matriz JSON extraída de mi servidor, he leído muchos tutoriales sin suerte, existe una forma única de hacerlo. Podría, por favor, señalar algunos recursos buenos para comenzar.Generar vista de lista de JSON en android

He leído this página embargo estoy atascado con el siguiente código:

import josecgomez.com.android.dev.webservice.objects.alerts; 

darme "" ya que ningún recurso identificado:

public class AlertsAdapter extends ArrayAdapter<alerts> 

Gracias, cualquier ayuda es muy apreciada!

+0

Se puede publicar un ejemplo de uno de los JSON objetos que desea mostrar? Además, ¿solo desea mostrar el nombre en la lista? –

Respuesta

16

JSON & listview trabajo te gusta este ..

1.displaying una lista de elementos

El SDK de Android proporciona una forma conveniente de mostrar rápidamente una lista de datos utilizando una superclase llamada android.app.ListActivity. Esta actividad ya proporciona un ContentView, configurado con un ListView, listo para usar y poblar con datos.

ListView ahora necesita datos para mostrar, junto con un medio para asignar esos datos en filas. ListAdaptors proporciona este mecanismo y se configuran en el ListView subyacente de ListActivity utilizando setListAdaptor.

Un SDK de Android proporciona adaptador (ArrayAdaptor) que sabe cómo manejar conjuntos de datos arbitrarios en ListViews (El SDK de Android también viene con varios otros ListAdaptors, tales como cursor adaptadores, que puede ayudar al conectar almacenamiento de datos local a un ListView). También debe proporcionar al adaptador un diseño que pueda usar para representar los elementos en cada fila. En el siguiente ejemplo estamos utilizando el diseño de Android SDK proporcionado, simple_list_item_1, que es un solo texto de la etiqueta perfecta para la colocación de nuestras cuerdas sueltas:

String[] elements = {"Line 1", "Line 2"}; 
setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, elements)); 

2.customizing el aspecto de cada elemento de la lista

Para lograr esto, tendrá que ir más allá del diseño integrado y ArrayAdaptor e implementar el suyo propio.

Comience por crear una clase ABC que se pueda usar para contener el autor y el contenido como cadenas. A continuación, crear y llenar un objeto con algunos datos de prueba que se mostrará en el elemento de lista personalizada:

public class ABC { 
    String userId; 
    String pwd; 
} 

Crear un archivo XML en el diseño /res/layout/list_item.xml para definir dos TextViews para visualizar el contenido y el autor en filas separadas. Para mostrarlos uno encima del otro, use un LinearLayout, configurado para representar verticalmente cada elemento dentro de él (android:orientation="vertical").

Una vez que se ha creado el archivo XML, el complemento Android Eclipse lo agregará automáticamente como referencia en el archivo R generado. Este archivo R se guarda en la carpeta/gen de su proyecto y actúa como un puente entre sus elementos XML y su código Java. Permite que su código Java haga referencia a elementos y archivos XML creados en las carpetas/res. El archivo que acaba de crear ahora se puede hacer referencia como R.layout.list_item en el código de Java, como lo hará a continuación en el adaptador de lista personalizado.

Cree una clase privada (dentro de la Actividad) llamada ListAdaptor cuyas subclases ArrayAdaptor. Esta clase se debe usar para almacenar una ArrayList que se muestra, así como para proporcionar una forma de asignar los objetos al TextViews que creó en el diseño anterior.

Este mapeo anula el ListAdaptor, y debe devolver un objeto Ver lleno con el contenido de los datos en la posición solicitada.

La implementación completa de la abcListAdaptor costumbre es a continuación:

private class abcListAdaptor extends ArrayAdapter<abc> { 
    private ArrayList<abc> abc; 
    public abcListAdaptor(Context context, int textViewResourceId, ArrayList<abc> items) { 
     super(context, textViewResourceId, items); 
     this.abc = items; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService       
(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.list_item, null); 
     } 

     abc o = abc.get(position); 
     TextView tt = (TextView) v.findViewById(R.id.uid); 
     TextView bt = (TextView) v.findViewById(R.id.pwd); 
     tt.setText(o.userid); 
     bt.setText(o.pwd); 
     return v; 
    } 
} 

Ahora el método onCreate se puede ajustar para utilizar el adaptador lista personalizada con los datos de prueba creados como se muestra a continuación:

public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
abc a = new abc(); 
a.userid = "tech"; 
a.pwd = "android"; 
ArrayList<abc> items = new ArrayList<abc>(); 
items.add(a); 
abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, items); 
setListAdapter(adaptor); 
} 

3.acceso a servicios remotos y datos de análisis

El SDK de Android contiene paquetes aime d al simplificar el acceso a las API basadas en HTTP. Las clases Apache HTTP se han incluido y se pueden encontrar en org.apache.http package.Utilizará estas clases, junto con las clases org.json para analizar los datos que regresan de un servidor.

podemos crear un método privado en la actividad que realiza una solicitud, analiza el resultado y devuelve un ArrayList de objetos. El código enumerado a continuación realiza la solicitud y busca el JSON array resultante, que se itera para extraer cada texto y elementos from_user.

ArrayList<abc> getDetail= new ArrayList<abc>(); 
    try { 
     HttpClient hc = new DefaultHttpClient(); 
     HttpGet get = new 
     HttpGet("<a href="http://your URL"></a>"); 
     HttpResponse rp = hc.execute(get); 

     if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
      String result = EntityUtils.toString(rp.getEntity()); 
      JSONObject root = new JSONObject(result); 
      JSONArray sessions = root.getJSONArray("results"); 

      for (int i = 0; i < sessions.length(); i++) { 
       JSONObject session = sessions.getJSONObject(i); 
       abc a = new abc(); 
       a.uid = session.getString("user"); 
       a.pwd = session.getString("password"); 
       getDetail.add(a); 
      } 
     } 
    } 

    catch (Exception e) { 
     Log.e("Activity", "Error loading JSON", e); 
    } 

cambiar ya los datos ficticio que utilizó previamente con una llamada al método de carga cuando se construye el adaptador lista personalizada en el método onCreate.

abcListAdaptor adaptor = new abcListAdaptor(this,R.layout.list_item, load()); 

4.creating interfaces de usuario que responden

El código en su estado actual tiene el potencial de causar una aplicación no responde de diálogo (ANR) para aparecer, lo que provocó que el usuario salga de la aplicación. Esto puede ocurrir debido al trabajo prolongado de realizar una solicitud remota de datos que se realizan en métodos como onCreate.

Las tareas de ejecución prolongada nunca se deben realizar en la secuencia de aplicación principal (que controla el bucle de eventos de la interfaz de usuario). En su lugar, deben engendrarse en hilos secundarios para realizar el trabajo.

Si bien la clase Thread de Java puede utilizarse para esta tarea, existe la complicación de que una vez completada la tarea de larga duración, generalmente desee cambiar la interfaz de usuario para informar los resultados (es decir, muestre una lista de cargado desde una solicitud).

Los elementos de la interfaz de usuario solo pueden modificar su estado desde el hilo principal, ya que el toolkit de Android no es seguro para subprocesos, por lo tanto, el hilo de fondo debe devolver el mensaje al hilo principal para manipular la interfaz de usuario.

Afortunadamente, el Android SDK proporciona una conveniente clase AsyncTask, que proporciona un mecanismo sencillo para que las tareas asincrónicas interactúen de forma segura con el subproceso de la interfaz de usuario. Esto se logra subclasificando AsyncTask y anulando el método doInBackground para realizar la tarea de ejecución prolongada, luego anula onPostExecute para realizar cualquier manipulación en la UI.

Cuando se crea AsyncTask (debe crearse en el subproceso de la interfaz de usuario) y se ejecuta, se invoca el método doInBackground en una cadena de fondo. Al finalizar, el método onPostExecute se invoca en el hilo principal de la IU.

Para usar esto en su aplicación, deberá implementar una clase privada dentro de la Actividad (como la clase de adaptador personalizado) llamada MyTask, que subclasifica AsyncTask. Puede anular el método doInBackground con el contenido de su método de carga anterior.

En lugar de devolver ArrayList, mantiene una variable de instancia en la Actividad para que los datos se puedan compartir entre las clases privadas. Luego, en onPostExecute puede configurar el adaptador de lista con los datos, como se hizo anteriormente en onCreate. El método onCreate ahora simplemente crea el objeto MyTask y llama al método de ejecución.

mejores sitios paraListview son this & this.

-

Saludos

TechEnd

4

necesita almacenar los elementos importantes de su objeto JSON en un nuevo objeto que ha creado usted mismo.

digamos que su objeto JSON le da claves con nombre, fecha y número de teléfono, necesita un objeto que contenga ese tipo de información.

su listview tendrá un ArrayAdapter de su nuevo tipo, cada celda de la vista de lista contendrá elementos de interfaz de usuario (tales como textviews) que se rellenan con la información de su objeto

se trata de un proceso de 3 pasos al menos y lo que necesita para hacer frente a las soluciones para cada uno de esos pasos de forma individual

0

le recomiendo que siga estos pasos:

  1. obtener datos de web y almacenarla
  2. Pase el stor ed los datos a un adaptador
  3. Ajuste el adaptador a su lista de

En el primer paso, le sugiero que los datos utilizando AsyncTask clase, lo que permite realizar operaciones en segundo plano y publicar los resultados sobre el hilo de interfaz de usuario sin tener para manipular hilos y/o manipuladores. En segundo lugar, debe analizar su contenido de acuerdo con la estructura JSON que está obteniendo. Finalmente, pase sus datos a un adaptador para completar su lista.

1

He encontrado un buen resource sobre el tema. Ahora tengo mi lista con los datos de Json. Muy recomendado para todos los principiantes. Gracias chicos por ayuda.

+1

No veo una razón por la que la respuesta anterior de Ashwani no funcione. Es tan simple como eso. – Nitin

+3

tienes respuestas muy calificadas no tan educadas para elegir tu propia respuesta como la correcta ... – dorjeduck

3

prueba este código en su actividad primero analizar los datos JSON en Array cadena y luego el conjunto de adaptadores su shoul Listview en XML de su actividad

try 
    { 

    JSONArray jArray = new JSONArray(result); 
    JSONObject jObj=new JSONObject(); 
    String[] data=new String[jArray.length()] 

     for(int i=0;i<jArray.length();i++) 
     { 
      jObj= jArray.getJSONObject(i); 
      data[i]=json_data.getString("value"); 

     } 

     GameAdapter adapter = new GameAdapter(this, R.layout.listview_item_row, data); 
     listView1 = (ListView)findViewById(R.id.listView1); 
     listView1.setAdapter(adapter); 
} 
catch(Exception e) 
{ 
} 
+0

Si este código no te ayuda, publicaré el código completo, por favor déjame saber si tu problema no está resuelto –

Cuestiones relacionadas