GridViews y extraer datos de los EditText

502 views
Skip to first unread message

Elias Ortiz Reyes

unread,
Jan 11, 2013, 6:54:01 AM1/11/13
to barcelo...@googlegroups.com
hola chicos!
Os comento:
Tengo una activity que muestra un GridView.
Me he creado un Adapter para que cada objeto de la Grid, sea asi:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/grid_texto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="20dp"
        android:text="@string/error"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/grid_edittext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/grid_texto"
        android:layout_below="@+id/grid_texto"
        android:ems="10" >
    </EditText>

</RelativeLayout>

Es decir, cada objeto se "convierte" en un TextView y un EditText.

Luego, debajo de la GridView, tendre un boton, el cual, al hacerle click, enviará a una base de datos (aqui no esta el problema) los datos extraidos de los EditText de la GridView.
Y el problema viene aqui....
¿Cómo extraigo esta información de los EditText? como accedo a ellos??
la verdad es que no tengo ni idea, y llevo un buen rato rompiendome la cabeza.... :(

Bernat

unread,
Jan 11, 2013, 6:58:35 AM1/11/13
to barcelo...@googlegroups.com
Buenas.

La solución esta en hacer varias cosas.

Para empezar el editText i el boton tienen que tener las propiedades:

focusable = false
focusableInTouchMode = false
clickable = true

I dins del adapter, en el getView, puedes hacer tu mismo el
findViewById del boton i el edit text, y asignar el listener en el
boton, de esta manera queda assignado en el adapter.

Si quieres llamar a un metodo de la activirty, lo mejor seria que
usaras el contyext con un cast.

Suerte

2013/1/11, Elias Ortiz Reyes <darklu...@gmail.com>:
> --
> Hazte miembro en la web del GDG ( http://goo.gl/ngNRi ), y para no perderte
> nada sigue al GDG Barcelona en Google+ ( http://goo.gl/f3xo4 ), Twitter (
> twitter.com/GDGBarcelona ), y su blog ( http://gdgbarcelona.blogspot.com.es/
> )
> ---
> Has recibido este mensaje porque estás suscrito al grupo "GDG Barcelona" de
> Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a
> barcelo...@googlegroups.com.
>
>
>

Marius B.

unread,
Jan 11, 2013, 7:46:31 AM1/11/13
to barcelo...@googlegroups.com
Simplificando mucho, si he entendido bien tienes un gridview donde cada objeto pintado MyObject tiene los campos texto y edit y lo que necesitas es hacer la operación inversa al adapter, o sea recuperar un Array de objetos MyObject donde los  atributos texto y edit son tus vistas pintadas en cualquier momento de la aplicación.

Si es así, el grid view tiene un getChildAtPosition (o algo así) que es el container de la vista pintada

por lo tanto, solución rápida y chapucera sería:

ArrayList<MyObject> myObjects ...etc
View v;

for(int x=0,x<grid.getChildCount();x++){
      v=grid.getChildAt(x);
      String texto=((TextView) v.findViewById(R.id.texto)).getText();
      String edit=((EditText) v.findViewById(R.id.edit)).getText().toString();
      myObjects.add(new MyObject(texto,edit));
}

OJO: esto lo cuento de memoria, puede que los métodos no se llamen exactamente así, no tengo editor delante.

--
-------------------------
Me gustaría cambiar el mundo, pero no me dan el código fuente.

Elias Ortiz Reyes

unread,
Jan 11, 2013, 8:23:34 AM1/11/13
to barcelo...@googlegroups.com
Antes de nada, GRACIAS a todos ;)

os cuento, tengo un problema con la solución de Marius

hago esto:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_datos_usuario);
gridview = (GridView)findViewById(R.id.gridViewDatosUser);
gridview.setAdapter(new DatosUsuarioAdapter(this, datosusuario));
int numchilds = gridview.getChildCount();
Log.e("hijos",Integer.toString(numchilds));
               
                v = gridview.getChildAt(1);

EditText texto = (EditText)v.findViewById(R.id.grid_edittext);
Log.e("MIAU MIAU","PPFFFFRRGASDFASDasd");

el problema es que numchilds me da 0. haciendo que falle el resto.
con lo cual, el findViewById me falla.

No lo entiendo, se supone que el Gridview, tiene realmente unos 10 objetos! 
Misa no entender...

Héctor Herrera

unread,
Jan 11, 2013, 8:51:03 AM1/11/13
to barcelo...@googlegroups.com
En ese punto aun no se ha poblado el gridview, deberías hacer todo eso en el evento click del botón que quieres poner debajo del grid


--

Elias Ortiz Reyes

unread,
Jan 11, 2013, 9:27:51 AM1/11/13
to barcelo...@googlegroups.com
Correcto!! Gracias Hector!! ahora si los "detecta" (por decirlo de alguna manera)

De todas maneras, he probado esto: (para aclararme conceptos tan solo) y funciona


bot_guardar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v2) {
int numchild2 = gridview.getChildCount();
Log.e("Numeros de hijos23", Integer.toString(numchild2)+"\n");
v = gridview.getChildAt(2);
String usu = ((EditText)v.findViewById(R.id.grid_edittext)).getText().toString();
Log.e("COntenido",usu);
}
});


Y si lo pongo asi FALLA
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
                v = gridview.getChildAt(2);

No entiendo porque... porque se supone que en el onStart() ya debería estar cargado todo,no??? :'(


El viernes, 11 de enero de 2013 12:54:01 UTC+1, Elias Ortiz Reyes escribió:
Reply all
Reply to author
Forward
0 new messages