![]() |
|
| 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 |
«
Tema Anterior
|
Siguiente tema
»
|
|
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
|
||||
|
||||
|
Cita:
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 |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 20:23:22 (GMT +1)
HTCMania: líderes desde el 2007






