2012-03-25 3 views
1

Die Frage ist: Wie bekomme ich einen Listener auf Elemente in einem LinearLayout, selbst auf einem ListView von LinearLayout.Über die Fokussierbarkeit mit ListView und LinearLayout in der Listenzeile

Konkret habe ich eine ListView, mit einer Liste von LinearLayout darin, und jedes enthält eine Button und ein TextView. Ich möchte nur wissen, ob der Benutzer auf die Button oder die TextView und in welcher Zeile klickt.

ich schon gar nicht für Code suchen, aber so weit, ich habe eine OnItemListener auf meinem ListView und wenn ich in klicken, es gibt die LinearLayout, nicht die Komponenten in.

Antwort

2

Sie werden implementieren müssen einen benutzerdefinierten Adapter und stellen Sie Ihre Listener für diese Ansichten (Button und TextView) in der getView() Methode manuell ein. Um die Zeile zu finden, in der Button oder TextView geklickt wurde, könnten Sie zuerst die Position (den Parameter, den Sie in der Methode getView() erhalten) als Tag festlegen und dann im Listener anhand des Tags der Ansicht herausfinden, mit welcher Zeile Sie arbeiten . Die Methode onItemClick sagt Ihnen nur, was in der Liste Zeile geklickt wurde.

Hier ist ein Beispielcode mit dem benutzerdefinierten Adapter:

class CustomCursorAdapter extends CursorAdapter { 

    private LayoutInflater mInflater; 
    private Context ctx; 

    public CustomCursorAdapter(Context context, Cursor c, 
      boolean autoRequery) { 
     super(context, c, autoRequery); 
     mInflater = LayoutInflater.from(context); 
     ctx = context; 
    } 

    @Override 
    public void bindView(View view, final Context context, Cursor cursor) { 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     String txt = cursor.getString(cursor.getColumnIndex("name")); 
     holder.text.setText(txt); 
     holder.button.setText(txt); 
     int currentPosition = cursor.getPosition(); 
     holder.text.setTag(new Integer(currentPosition)); 
     holder.button.setTag(new Integer(currentPosition)); 

     OnClickListener listener = new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       int thePosition = (Integer) v.getTag(); 
       if (v.getId() == R.id.button1) { 
        Toast.makeText(ctx, 
          "You clicked the Button from the row " 
            + thePosition + "!", Toast.LENGTH_SHORT).show(); 
       } else if (v.getId() == R.id.textView1) { 
        Toast.makeText(ctx, 
          "You clicked the TextView from the row " 
            + thePosition + "!", Toast.LENGTH_SHORT).show(); 
       }    
      } 
     }; 
     holder.text.setOnClickListener(listener); 
     holder.button.setOnClickListener(listener); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = mInflater.inflate(R.layout.adapters_cursor_adapter_clicks, 
       null); 
     ViewHolder holder = new ViewHolder(); 
     holder.text = (TextView) v.findViewById(R.id.textView1); 
     holder.button = (Button) v.findViewById(R.id.button1); 
     v.setTag(holder); 
     return v; 
    } 

    class ViewHolder { 
     TextView text; 
     Button button; 
    } 

} 

Ich benutzte einen einzigen OnClickListener für beide Ansichten, können Sie eine 2 Zuhörer für jede Ansicht followinf dem gleichen Prinzip nutzen könnten. Die vollständige Klasse + Layout-Datei finden Sie hier könnte: http://pastebin.com/uM0mb4mq (mit Kern finden Sie hier: git: //gist.github.com/2625797.git)

+0

Vielen Dank für die Antwort. Ich muss es nicht korrekt implementieren, aber das Positionsattribut von getView() ist eigentlich die Nummer des letzten sichtbaren Elements, egal wo ich klicke. Auf welches Element sollte ich das onItemClick setzen? Ich meine mein listView ist auf Aktivitätsklasse so deklariert und meine Listener sind in der cursorAdapter-Klasse, so ... –

+0

@SebastienFERRAND Sie nicht verstanden meine Antwort, habe ich einige Beispielcode mit einem benutzerdefinierten 'CursorAdapter' gepostet, die tun sollten was du fragst .. – Luksprog

+0

Funktioniert perfekt, wenn (natürlich) ich den Tag das angeklickte Element bekomme. Vielen Dank. –

2

Sie müssen eine benutzerdefinierte Adapter erklären, das zu tun.

Dieses Tutorial hat mir sehr geholfen heraus: http://www.vogella.de/articles/AndroidListView/article.html#listview_adaptermodel

Hier ein Ausschnitt aus einem meiner Projekte ist. Er wechselt zwischen zwei Bildern in einem ImageView, wenn er angeklickt wird.

Im obigen Beispiel wird getView() für jedes listItem aufgerufen. Ich bekomme Zugriff auf meine ImageVeiw durch Aufruf von findViewById() auf der Ansicht v (ein RelativeLayout in jedem listItem)

+0

Danke für die Antwort. Eigentlich benutze ich einen benutzerdefinierten CursorAdapter, aber ich bekomme immer noch nicht, wie ich die Position in der listView meines Elements in einem linearLayout, auf das geklickt wurde, auch im Tutorial kennen würde. –