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

Respuesta
 
Herramientas
  #1  
Viejo 16/04/14, 16:24:01
Array

[xs_avatar]
angelete1992 angelete1992 no está en línea
Miembro del foro
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
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)
__________________
Aplicaciones y juegos android Superandroide.com
Responder Con Cita


  #2  
Viejo 16/04/14, 16:58:25
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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
Array

[xs_avatar]
angelete1992 angelete1992 no está en línea
Miembro del foro
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
 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
__________________
Aplicaciones y juegos android Superandroide.com
Responder Con Cita
  #4  
Viejo 17/04/14, 21:13:54
Array

[xs_avatar]
angelete1992 angelete1992 no está en línea
Miembro del foro
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Nadie puede ayudarme?
__________________
Aplicaciones y juegos android Superandroide.com
Responder Con Cita
  #5  
Viejo 18/04/14, 13:07:56
Array

[xs_avatar]
angelete1992 angelete1992 no está en línea
Miembro del foro
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
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
__________________
Aplicaciones y juegos android Superandroide.com
Responder Con Cita
  #6  
Viejo 18/04/14, 13:24:46
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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
Array

[xs_avatar]
angelete1992 angelete1992 no está en línea
Miembro del foro
 
Fecha de registro: mar 2012
Mensajes: 134
Modelo de smartphone: LG Nexus 4
Tu operador: Movistar
Sí, seguro que es más eficiente implementarlo como tú dices, lo probaré.

Muchas gracias
__________________
Aplicaciones y juegos android Superandroide.com
Responder Con Cita
Respuesta

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



Hora actual: 20:52:11 (GMT +2)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /