2012-06-22 21 views
13

Tengo un ListView personalizado con dos botones y cuando hago clic en cualquier botón quiero obtener la etiqueta de texto en Listview y por ahora solo brindo un brindis con eso. Hasta el momento, nada ha funcionado. Sigo recibiendo el último elemento de mi matriz.Android: Obtener el elemento de vista de lista desde el botón clic en vista de lista personalizada

Aquí es una captura de pantalla para darle una mejor idea de lo que quiero decir

enter image description here

Aquí está mi subclase adaptador para mi ListView encargo

static final String[] Names = 
      new String[] { "John", "Mike", "Maria", "Miguel"}; 


class MyArrayAdapter extends ArrayAdapter<String> { 
    private final Context context;  

    int which; 

    public MyArrayAdapter(Context context, String[] pValues) { 
     super(context, R.layout.main, pValues); 
     this.context = context; 
     values = pValues; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     rowView = inflater.inflate(R.layout.main, parent, false); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     ImageView imageView = (ImageView) rowView.findViewById(R.id.logo); 
     Button call = (Button) rowView.findViewById(R.id.button1); 
     Button chat = (Button) rowView.findViewById(R.id.button2); 
     textView.setText(values[position]); 


     // Change icon based on name 
     s = values[position];   
     which = position; 
     call.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       String name = values[which]; 
       Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return rowView; 
    } 
} 

Editar:

String name = textView.getText().toString(); 
RelativeLayout ll = (RelativeLayout)v.getParent(); 
textView = (TextView)ll.findViewById(R.id.label); 
Toast.makeText(CustomListView.this, name, 
Toast.LENGTH_SHORT).show(); 
+0

intente 'textView.getText(). ToString()' en lugar de 'values ​​[which]'. –

Respuesta

14

fácil de hacer:

call.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      RelativeLayout rl = (RelativeLayout)v.getParent(); 
      TextView tv = (TextView)rl.findViewById(R.id.label); 
      String text = tv.getText().toString(); 
      Toast.makeText(CustomListView.this, text, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
+0

Usé un diseño relativo en mi XML. He hecho esto y hay algunas mejoras, pero la primera vez que hago clic en cada botón obtengo el valor de la vista de texto anterior, después de lo cual obtengo los valores correctos. También aparece una advertencia en Logcat: 06-22 14: 28: 29.279: W/Resources (14841): Convertir a cadena: TypedValue {t = 0x12/d = 0x0 a = 3 r = 0x7f050002} – Amanni

+0

Eso no debería ' Sucede ya que el código anterior usa el botón presionado para encontrar el padre (fila) y luego lo usa para encontrar la vista de texto entre hermanos ... ¿podría editar su publicación para mostrar el código tal como está ahora? – Barak

+0

He editado mi publicación ahora. También estoy sorprendido porque creo que debería funcionar. – Amanni

5

use el atributo setTag de la Vista ..............

como

Button call = (Button) rowView.findViewById(R.id.button1); 
call.setTag(position); 

y

call.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int which = -1; 
       Obejct obj = v.getTag(); 
       if(obj instaceof Integer){ 
       which = ((Integer)obj).intValue(); 
        } 

       if(which >-1){ 
       String name = values[which]; 
       Toast.makeText(CustomListView.this, name, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
+0

Guau, esto funcionó. ¿Puede explicar brevemente qué está haciendo exactamente? – Amanni

+0

, básicamente, cada vista tiene capacidad para guardar cualquier objeto utilizando setTag. Solo configuro la posición en la etiqueta con cada botón en esa fila y cuando aparece View en onClick (que es el mismo botón) simplemente recuperar la etiqueta de ese botón en particular ......... –

+1

Muchas gracias – Amanni

3

Si usted tiene un ListActivity, y usted no está utilizando su propio adaptador, todavía se puede obtener el elemento de la lista que pertenece al botón golpeado, como lo siguiente:

En el archivo de diseño de la lista de fila:

<ImageButton 
     android:id="@+id/button_call" 
     android:layout_height="48dip" 
     android:layout_width="48dip" 
     android:contentDescription="Call" 
     android:onClick="callBuddy" 
     android:src="@drawable/call_button_image" 
     /> 

En su ListActivity:

public void callBuddy(View view) { 

    int position = getListView().getPositionForView((View) view.getParent()); 
    Buddy buddyToCall = (Buddy) getListView().getItemAtPosition(position); 

    Toast.makeText(MyListActivity.this, String.format("Calling your buddy %s.", buddyToCall.name), Toast.LENGTH_SHORT).show(); 

} 
0

Conjunto onclick = "clic" al botón de XML/imagen/etc ... de

y en su actividad, hacer:

public void click(View v) { 
    final int position = getListView().getPositionForView(v); 
    String text = getListView().getItemAtPosition(position).toString(); 
    Toast.makeText(getApplicationContext, text, Toast.LENGTH_SHORT).show(); 
} 
+0

Wow, esto parece tan simple. ¿No tienes que definir nada más? ¿Cómo lo que es 'getListView()' o 'posición' –

+0

posición int final = getListView(). getPositionForView (v); –

0

simplemente utilizar getItem() y pase la posición Ejemplo: getItem(position).getID() aquí el método getID() es el método getter

Cuestiones relacionadas