Home Menu

Menu



Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 16/04/14, 16:24:01
Avatar de angelete1992
angelete1992 angelete1992 no está en línea
Miembro del foro
Mensajes: 134
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Mencionado: 2 comentarios
Tagged: 0 hilos
No sé cómo detectar click en botón de ListView Personalizada

Hola a todos, estoy haciendo mi TFG y ahora mismo estoy con el caso de uso de añadir usuario como amigo.

Tengo un servidor con BBDD mySql y scripts PHP que utilizo como intermediario entre la aplicación y el servidor para insertar y recuperar datos.

Bien pues busqué por ahí y encontré un tutorial para hacer ListViews personalizados para que cada elemento de la lista tenga una imagen, un nombre y dos botones como puede verse en la siguiente captura:



Hasta ahí perfecto, pero ahora no sé cómo escuchar el click de los diferentes botones.

El listView personalizado lo defino con el siguiente layout:

Código:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/gray"
    android:orientation="horizontal" >
    
    <ImageView
        android:id="@+id/imageUser"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <TextView
        android:id="@+id/nameUser"
        android:textSize="20sp"
        android:layout_marginLeft="20dp"
        android:layout_toRightOf="@id/imageUser"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    

    
    <Button
        android:id="@+id/fightButton"
        android:background="@drawable/button_fight"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    <Button
        android:id="@+id/addUserButton"
        android:background="@drawable/button_tick"
        android:layout_toLeftOf="@id/fightButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>
El adapter es éste:

Código:
package com.angeljose.englishpursuit;

import java.util.ArrayList;

import com.angeljose.englishpursuit.SearchFriendActivity.asyncSearchFriend;

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class AdapterFriends extends BaseAdapter{

	protected Activity activity;
	protected ArrayList<Friend> items;


	public AdapterFriends(Activity activity, ArrayList<Friend> items) {
	    this.activity = activity;
	    this.items = items;
	  }

	@Override
	public int getCount() {
		return items.size();
	}

	@Override
	public Object getItem(int arg0) {
		return items.get(arg0);
	}

	@Override
	public long getItemId(int position) {
		return items.get(position).getId();
	}

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

		// Generamos una convertView por motivos de eficiencia
		View v = convertView;

		//Asociamos el layout de la lista que hemos creado
		if(convertView == null){
			LayoutInflater inf = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
			v = inf.inflate(R.layout.item_friend, null);
		}

		// Creamos un objeto Friend
		final Friend dir = items.get(position);
		//Rellenamos la fotografía
		ImageView foto = (ImageView) v.findViewById(R.id.imageUser);
		foto.setImageDrawable(dir.getFoto());
		//Rellenamos el nombre
		TextView nombre = (TextView) v.findViewById(R.id.nameUser);
		nombre.setText(dir.getNombre());
		//Rellenamos el boton
		 Button bAddUser = (Button) v.findViewById(R.id.addUserButton);
//
		 Button bFight = (Button) v.findViewById(R.id.fightButton);
		


		
		bFight.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				int position = (int) dir.id;
				// TODO Auto-generated method stub
				Log.d("clikando "+dir.id,"clikando");
				

				
			}
		});
		

	

		// Retornamos la vista
		return v;
	}


}
Y finalmente el método importante de la clase de la activity donde muestro estos listview:

Código:
		   ListView lista = (ListView) findViewById(R.id.listaFriends);

		   
		   if(matches>0){
			   
		        ArrayList<Friend> arraydir = new ArrayList<Friend>();
		        Button[] bAddFriend = new Button [matches];
		        Button[] bfight = new Button [matches];
		        Friend[] friendsT = new Friend[matches];
		        
		        for(int i=0; i<matches; i++){
		        	
		        	bAddFriend[i]= new Button(SearchFriendActivity.this);
		        	bfight[i]= new Button(SearchFriendActivity.this);
			        friendsT[i] = new Friend(getResources().getDrawable(R.drawable.user), friendsReturn[i], i);
			        arraydir.add(friendsT[i]);
		        	
		        }
		        
		        // Creo el adapter personalizado
		        AdapterFriends adapter = new AdapterFriends(SearchFriendActivity.this, arraydir);
		 
		        // Lo aplico
		        lista.setAdapter(adapter);
		   }
No sé que hacer porque no sé como obtener el objeto botón en la clase de la Activity para ponerle un listener.

Un saludo y gracias de antemano !
Imágenes Adjuntas
Tipo de Archivo: jpg 2014-04-16 14.13.13.jpg (50.6 KB, 107 visitas)
Responder Con Cita


  #2  
Viejo 16/04/14, 16:58:25
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Ya lo estás detectando, aquí:

bFight.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
int position = (int) dir.id;
// TODO Auto-generated method stub
Log.d("clikando "+dir.id,"clikando");



}
});

El código de los eventos dentro de un View de un Adapter se hace en el método getView, tal y como lo estás haciendo.

Y si la app, por lo que parece, es una especie de "Triviados", hacerlo con PHP y REST es una mala idea. Deberías de utilizar un protocolo contínuo como XMPP o WebSocket. Siendo mucho más fácil el segundo que el primero, de hecho a día de hoy no he encontrado ninguna librería pública para Android que trabaje con XMPP de forma medio decente, además que programar el servidor es bastante más complejo.

Última edición por kriogeN Día 16/04/14 a las 17:01:54
Responder Con Cita
Gracias de parte de:
  #3  
Viejo 16/04/14, 18:51:47
Avatar de angelete1992
angelete1992 angelete1992 no está en línea
Miembro del foro
Mensajes: 134
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Mencionado: 2 comentarios
Tagged: 0 hilos
Cita:
Originalmente Escrito por kriogeN Ver Mensaje
Ya lo estás detectando, aquí:

bFight.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
int position = (int) dir.id;
// TODO Auto-generated method stub
Log.d("clikando "+dir.id,"clikando");



}
});

El código de los eventos dentro de un View de un Adapter se hace en el método getView, tal y como lo estás haciendo.

Y si la app, por lo que parece, es una especie de "Triviados", hacerlo con PHP y REST es una mala idea. Deberías de utilizar un protocolo contínuo como XMPP o WebSocket. Siendo mucho más fácil el segundo que el primero, de hecho a día de hoy no he encontrado ninguna librería pública para Android que trabaje con XMPP de forma medio decente, además que programar el servidor es bastante más complejo.
Muchas gracias por tu respuestas.
Perfecto, en la clase del Adapter puedo capturar los clicks perfectamente pero es que necesito capturarlos en la otra (activity donde se muestran) porque es ahí donde tengo los datos (nombres de los usuarios que devuelve la consulta al servidor) y desde donde quiero hacer la nueva inserción en el servidor.

Respecto a lo que dices de que no utilice php, puede haber opciones mejores como las que dices, pero como en el grado he visto esa tecnología he querido aplicarla ahí. Además es un trabajo, en caso de que fuera un producto profesional barajaría más opciones, pero a estas alturas prefiero dejarlo así.

Un saludo
Responder Con Cita
  #4  
Viejo 17/04/14, 21:13:54
Avatar de angelete1992
angelete1992 angelete1992 no está en línea
Miembro del foro
Mensajes: 134
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Mencionado: 2 comentarios
Tagged: 0 hilos
Nadie puede ayudarme?
Responder Con Cita
  #5  
Viejo 18/04/14, 13:07:56
Avatar de angelete1992
angelete1992 angelete1992 no está en línea
Miembro del foro
Mensajes: 134
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Mencionado: 2 comentarios
Tagged: 0 hilos
Bueno ya lo he solucionado creando un thread que compruebe en background si una variable es true.
Dicha variable será cambiada a true desde la clase del adapter al hacer click en el botón.

Un saludo
Responder Con Cita
  #6  
Viejo 18/04/14, 13:24:46
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Eso es matar moscas a cañonazos, puedes resolverlo de 1000 formas distintas, la más sencilla de todas es creando un Listener, cuando creas el Adapter le asignas el Listener y el onClick en el Adapter ejecutará al Listener, que realmente se ejecutará en la Activity.
Responder Con Cita
  #7  
Viejo 18/04/14, 13:43:03
Avatar de angelete1992
angelete1992 angelete1992 no está en línea
Miembro del foro
Mensajes: 134
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Mencionado: 2 comentarios
Tagged: 0 hilos
Sí, seguro que es más eficiente implementarlo como tú dices, lo probaré.

Muchas gracias
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 03:57:54 (GMT +2)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007