2012-06-22 8 views
13

Ho un ListView personalizzato con due pulsanti e I quando faccio clic su uno dei due pulsanti su qualsiasi riga Voglio ottenere l'etichetta di testo su Listview e per ora basta visualizzare un brindisi con esso. Finora non ha funzionato. Continuo a ricevere l'ultimo elemento nel mio array.Android: Ottieni l'oggetto listview dal pulsante su cui si fa clic nell'elenco personalizzato

Ecco uno screenshot per darvi una migliore idea di quello che voglio dire

enter image description here

Ecco il mio sottoclasse adattatore per il mio ListView personalizzato

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; 
    } 
} 

Edit:

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

try 'textView.getText(). ToString()' al posto di 'values ​​[which]'. –

risposta

14

Facile da fare:

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

Ho usato un layout relativo nel mio XML. Ho fatto questo e ci sono alcuni miglioramenti ma la prima volta che clicco su ciascun pulsante ottengo il valore del precedente TextView dopo il quale ottengo i valori corretti. Ho anche ricevuto un avviso in Logcat: 06-22 14: 28: 29.279: W/Resources (14841): Conversione in stringa: TypedValue {t = 0x12/d = 0x0 a = 3 r = 0x7f050002} – Amanni

+0

Che shouldn ' Non succede perché il codice sopra riportato usa il pulsante cliccato per trovare il genitore (riga) e poi lo usa per trovare la vista testo di pari livello ... potresti modificare il tuo post per mostrare il codice così com'è adesso? – Barak

+0

Ho modificato il mio post ora. Sono sorpreso anche perché credo che dovrebbe funzionare. – Amanni

5

utilizzare l'attributo setTag della vista ..............

come

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

e

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

Wow, questo ha funzionato. Puoi spiegare brevemente cosa stai facendo esattamente – Amanni

+0

in pratica ogni vista è in grado di mantenere qualsiasi oggetto usando setTag Ho appena impostato la posizione nel tag con ogni pulsante di quella riga e quando ottieni View in onClick (che è lo stesso pulsante) ho solo torna indietro il tag da quel particolare pulsante ......... –

+1

Grazie mille – Amanni

3

Se si dispone di un ListActivity, e non si sta usando il proprio adattatore, è ancora possibile ottenere l'elemento della lista appartenente al pulsante TAPpato, in questo modo:

Nel file di layout della fila lista:

<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" 
     /> 

Nel vostro 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

Set onClick = "click" per xml tasto/immagine/etc di ...

e nella vostra attività, fare:

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 questo sembra così semplice.Non devi definire qualcos'altro? Come quello che è 'getListView()' o 'position' –

+0

final int position = getListView(). getPositionForView (v); –

0

semplicemente utilizzare getItem() e passare alla posizione Es: getItem(position).getID() qui metodo getID() è metodo getter

Problemi correlati