2016-07-20 16 views
0

Ich habe eine Liste von verschiedenen TextViews von einem benutzerdefinierten Adapter verwaltet.setOnItemClickListener in nur Listenelemente

list.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#FDD017" > 

     <ListView android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content"/> 

    </LinearLayout> 

element.xml

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" > 

    <View android:id="@+id/line1" 
     android:layout_width="fill_parent" 
     android:layout_height="5dp" 
     android:background="#fd1726" /> 

    <TextView 
     android:id="@+id/out1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" 
     android:background="#17c4fd" /> 

    <View android:id="@+id/line2" 
     android:layout_width="fill_parent" 
     android:layout_height="1dp" 
     android:background="#236e01" /> 

    <TextView 
     android:id="@+id/out2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" 
     android:background="#17c4fd" /> 

    <View android:id="@+id/line3" 
     android:layout_width="fill_parent" 
     android:layout_height="1dp" 
     android:background="#236e01" /> 

    <TextView 
     android:id="@+id/out3" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="6dip" 
     android:paddingLeft="6dip" 
     android:textSize="17sp" 
     android:textStyle="bold" 
     android:background="#c6c6c7" /> 

</LinearLayout> 

In meiner Tätigkeit ich setOnItemClickListener verwenden, um eine Aktion auszuführen, wenn auf ListElements klicken.

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapter_view, View view, int position, long id) { MyAction(); } 
    }); 

Ist es möglich, setOnItemClickListener nur zu starten, wenn in einem Klick auf R.id.out1 und R.id.out2 in R.id.out3 Textviews und nichts tun zu klicken?

+3

Dont tun dies 'lv.setOnItemClickListener' stattdessen Element klickt in den Adapter handhaben, wo Sie verwalten können, welche tv geklickt wurde –

+0

man muss wirklich durch einige grundlegende Listenansicht Beispiele gehen. Das Festlegen des click listeners für einige Ansichten in einem listView-Element ist ein grundlegendes Thema. Siehe hier: http://www.vogella.com/tutorials/AndroidListView/article.html und https://developer.android.com/guide/topics/ ui/layout/listview.html. Außerdem empfehle ich, stattdessen eine recyclerView zu verwenden, es ist eine bessere listView: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html – Opiatefuchs

+1

Ja, können Sie tun, wie Tim sagte oder Sie können überprüfen, wie die ID von View in onItemClick wie, If (view.getId() == R.id.out3) { // Do Ihre Sachen hier } –

Antwort

1

Machen Sie GetView wie unten nur setOnClickListener()TextView

Auch unter Code entfernen, um R.id.out3 eingestellt.

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapter_view, View view, int position, long id) { MyAction(); } 
    }); 

GetView-Methode.

@Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     View row = convertView; 
     final ViewHolder holder; 

     if (convertView == null) { 

      /****** Inflate dahsboadrf_single_row.xml file for each row (Defined below) *******/ 
      row = inflater.inflate(R.layout.element, null); 

      /****** View Holder Object to contain tabitem.xml file elements ******/ 

      holder = new ViewHolder(); 

      holder.out1 = (TextView) row.findViewById(R.id.out1); 
      holder.out2 = (TextView) row.findViewById(R.id.out2); 
      holder.out3 = (TextView) row.findViewById(R.id.out3); 

      row.setTag(holder); 
     } else 
      holder = (ViewHolder) row.getTag(); 

     holder.out1.setText(""); // your logic 
     holder.out2.setText(""); // your logic 
     holder.out3.setText(""); // your logic 

     holder.out3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // And you are done. 
      } 
     }); 
     return row; 
    } 

    class ViewHolder { 

     TextView out1, out2, out3; 
    } 
1

Es gibt zwei Möglichkeiten, dies zu tun, Sie können das globale OnItemClickListener festlegen, und dann ist die Ansicht verfügbar. (Sie können sogar die Ansicht von Ihrem Adapter mit getView(position) zurückgeben, wenn Sie wollten, aber es gibt keine Notwendigkeit)

Sie können dann überprüfen, dass es die gewünschte Ansicht ist, und eine Aktion abschließen, sonst tun nichts.

Der andere Weg, der ein bisschen sauberer ist meiner Meinung nach ist einfach OnClickListeners auf die Ansichten in Ihrem benutzerdefinierten Adapter setzen.

Hoffentlich verwenden Sie ein ViewHolder Muster. Innerhalb Sie ViewHolder sind, wenn Sie die Ansichten definieren, können Sie auch, würde die onClick wie Sie behandeln gehen out3.setOnClickListener(this);

dann nur noch eine andere Art und Weise wird die Ansicht registriert Click-Ereignisse haben.