|
||
|
![]() |
![]() |
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
|
||||
|
||||
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> 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; } } 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); } Un saludo y gracias de antemano !
__________________
![]() |
|
#2
|
||||
|
||||
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. |
Gracias de parte de: | ||
#3
|
||||
|
||||
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. ![]() 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
__________________
![]() |
#4
|
||||
|
||||
Nadie puede ayudarme?
__________________
![]() |
#5
|
||||
|
||||
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
__________________
![]() |
#6
|
||||
|
||||
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.
|
#7
|
||||
|
||||
Sí, seguro que es más eficiente implementarlo como tú dices, lo probaré.
Muchas gracias
__________________
![]() |
![]() |
![]() |
||||||
|