jueves, 6 de diciembre de 2012

json.parse: bad control character in string literal

Hoy haciendo una aplicación con ajax el navegador me ha dado un error "json.parse: bad control character in string literal".
Imagen de error con el firebug

El error lo daba la llamada
json = $.parseJSON(string);
El problema era que yo estaba generando un objeto json desde java dentro de una stringbuilder, y una cadena contenía el carácter retorno de carro "\n". Buscando por internet encontré cientos de post que comentaban el problema y hacían perder el tiempo, pues daban soluciones que no funcionaban. En este en concreto se habla del api de json y se especifica que otros caracteres pueden fallar. Al final la solución era crear un objeto json desde java. Este es el trozo de código final en la jsp que llama el js.
Map obj = new HashMap();
obj.put("id", new Long(id_mensaje));
obj.put("cuerpo",mensaje.getCuerpo());
obj.put("fechaRecibido",MensajesUtil.formatDate(mensaje.getFechaEnvio()));
obj.put("usuarioOrigen",MensajesUtil.getName(mensaje.getUsuarioOrigen(), cms));
obj.put("usuarioOrigenId",mensaje.getUsuarioOrigen());
String jsonText = org.json.simple.JSONValue.toJSONString(obj);
out.println(jsonText);
Saludos.

sábado, 17 de noviembre de 2012

CProject. Gestor de proyectos en Android

Desde hace tiempo estoy buscando un gestor de proyectos en android que cumpla con mis necesidades, pero no encuentro ninguno. Así que hace 4 días me pregunté: ¿y si retomo mi proyecto de sincronización de tareas Android-OpenERP y le doy un lavado de cara?. Dicho y hecho. En 4 días, con sus noches, he realizado un pequeño proyectito.

CProject - Créditos del proyecto.

Aún le queda mucho por mejorar. Por ahora sólo se pueden crear proyectos nuevos, tareas en dichos proyectos, y salvar toda la información en SQLite en el propio dispositivo. Por supuesto también se pueden migrar los proyectos a OpenERP mediante Web-Services.
CProject - Action bar con botón que ejecuta Web Service para migrar datos a OpenERP.

En mi lista de TODOs para el proyecto tengo en mente mejorar e implementar una serie de cosas, como por ejemplo que se pinte el diagrama de Gantt, asignar etiquetas a los proyectos, estadísticas, popups para introducir fechas, etc.

CProject - Pantalla de introducción de nombre de proyecto.

En sucesivos post iré comentando el estado del proyecto, he incluso cuando termine algunas características más grabaré algún vídeo para subirlo al blog.
Por último, si alguien está interesado en el proyecto, o desea que implemente alguna característica especial, o simplemente quiere colaborar, que contacte conmigo.
Saludos.

jueves, 15 de noviembre de 2012

Custom OnItemClickListener para elementos del ListView

En la entrada anterior realicé un menú contextual para los items de un ListView. El caso es que en mi aplicación quiero que haya una opción por defecto (que también está en el menú contextual) para las pulsaciones simples.

Encontré un post muy interesante que trataba el tema (en inglés), y otro post adaptado del anterior en español.

En mi caso lo he adaptado a mis necesidades, puesto que mis opciones del ListView se leen de base de datos.

A continuación mi código de ejemplo


private void initActivity(){
        setContentView(R.layout.main);
        
        registerForContextMenu(getListView());  
        
        // Habilito click simple en la lista de elementos
        // Hack by http://stackoverflow.com/questions/4852307/listview-onclick-goes-to-a-new-activity
        //libreyextremo.blogspot.com.es/2012/03/tutorial-android-parte-13-navegacion.html
        ListView lv = (ListView)findViewById(android.R.id.list);
        final Intent activity = new Intent(this,CTaskActivity.class);
        OnItemClickListener myclickListView = new OnItemClickListener()
        {
         public void onItemClick(AdapterView parent, View view,int position, long id){
          
           long id_proyecto = getIdProjectByPositionListView(position);
           activity.putExtra("id_proyecto", id_proyecto);
           
           startActivity(activity);
             
         }
         
        };

        setListAdapter(new ArrayAdapter(context,android.R.id.list));
        lv.setOnItemClickListener(myclickListView);
        
     // Cargo los proyectos en el sistema
        showAllProjects();
 }

El código es bastante sencillo, simplemente se trata de hacer un OnItemClickListener persnalizado, asignarlo al ListView y después cargar los items. Ojo, que si se cargan antes los items no se mostrará nada en pantalla.

Por último, initActivity() es un método que llamo desde onCreate() de la actividad.

Saludos.

Related Posts Plugin for WordPress, Blogger...