2011-10-31 12 views
18

Ho un controllo ListView che contiene un TextView in ogni riga oltre a un numero di altre visualizzazioni. TextView rende il contenuto html che può contenere collegamenti.Android - ListView non riceve OnItemClick per la visualizzazione di testo con collegamenti selezionabili

Il seguente codice viene visualizzato nell'elenco. m_textview.setMovementMethod (LinkMovementMethod.getInstance()); m_textview.setText (Html.fromHtml (myhtmlcontent));

Ciò causa tuttavia che la listview non riceve più sugli eventi click. Ho deciso di inserire l'elenco codice onclick nella vista restituita dall'adattatore. Questo non funziona come desiderato. Ora posso avviare un'altra attività quando faccio clic in qualsiasi punto della riga tranne la vista testo. Voglio che gli utenti siano in grado di fare clic sulla parte non link della visualizzazione testo e avviare un'altra attività.

Se si sposta l'onclick sulla vista testo anziché sulla vista genitore, funziona, ma ora un clic sul collegamento attiva due eventi: uno per il clic sul collegamento e l'altro per la vista testo (che non è desiderato).

Ho notato che Google + e fa capolino su Android funziona nel modo che voglio. Non sono sicuro di come ciò possa essere realizzato.

risposta

1

Le viste focalizzabili all'interno di una voce di ListView disabiliteranno la possibilità di selezionare elementi ListView. L'applicazione di android:focusable="false" a TextView consentirà a OnItemClick di funzionare nuovamente. Potrebbe anche essere necessario applicare android:focusableInTouchMode="false" per fare in modo che la trackball ignori i collegamenti perché facendo clic sulla trackball su un elemento selezionabile in un controllo ListView è possibile sia fare clic sul collegamento sia sull'elemento ListView.

21

Questo è in realtà un BUG. Per risolvere questo problema puoi aggiungere android:descendantFocusability="blocksDescendants" al tuo file ListView's layout xml. Per es

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

<TextView 
    android:id="@+id/lblStatusMessage" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:autoLink="web" 
    android:focusable="false" 
    android:textSize="15sp" /> 
</LinearLayout> 

Fonte: this e this

Buona fortuna :)

+0

Potrebbe essere troppo tardi .. ma mi è stato avere lo stesso problema e ho trovato questo post senza risposta. :) –

0

È possibile allegare sulla lista visualizzare un setOnItemClickListener.

0

Ho avuto lo stesso problema e nessuna di queste risposte ha funzionato per me. Alla fine, sono riuscito a risolvere il problema rimuovendo l'attributo android:inputType="textMultiLine".

0

TextView che risponde solo agli eventi di tocco dei collegamenti. Sulla base di https://stackoverflow.com/a/7327332/1768722

 public class AutoLinkTextView extends TextView { 

      public AutoLinkTextView(Context context, AttributeSet attrs, int defStyle) { 
       super(context, attrs, defStyle); 
       init(); 
      } 

      public AutoLinkTextView(Context context, AttributeSet attrs) { 
       super(context, attrs); 
       init(); 
      } 

      public AutoLinkTextView(Context context) { 
       super(context); 
       init(); 
      } 

      private void init() { 
       this.setAutoLinkMask(Linkify.ALL); 
      } 

      /** 
      * @Linkify applies to a movementMethod to the textView @LinkMovementMethod. 
      *   That movement method thought it implements a scrolling 
      *   vertically method it overrides any other scrolling method the 
      *   parent has. 
      * 
      *   Although touchEvent can be dispached to the parent, the specific 
      *   parent ScrollView needed the whole sequence ACTION_DOWN , 
      *   ACTION_MOVE, ACTION_UP to perform (sweep detection). So the 
      *   solution to this problem is after applying @Linkify we need to 
      *   remove the textView's scrolling method and handle the @LinkMovementMethod 
      *   link detection action in onTouchEvent of the textView. 
      */ 
      @Override 
      public boolean onTouchEvent(MotionEvent event) { 
       final TextView widget = (TextView) this; 
       final Object text = widget.getText(); 
       if (text instanceof Spannable) { 
        final Spannable buffer = (Spannable) text; 
        final int action = event.getAction(); 

        if (action == MotionEvent.ACTION_UP 
          || action == MotionEvent.ACTION_DOWN) { 
         int x = (int) event.getX(); 
         int y = (int) event.getY(); 

         x -= widget.getTotalPaddingLeft(); 
         y -= widget.getTotalPaddingTop(); 

         x += widget.getScrollX(); 
         y += widget.getScrollY(); 

         final Layout layout = widget.getLayout(); 
         final int line = layout.getLineForVertical(y); 
         final int off = layout.getOffsetForHorizontal(line, x); 

         final ClickableSpan[] link = buffer.getSpans(off, off, 
           ClickableSpan.class); 

         if (link.length != 0) { 
          if (action == MotionEvent.ACTION_UP) { 
           link[0].onClick(widget); 
          } else if (action == MotionEvent.ACTION_DOWN) { 
           Selection.setSelection(buffer, 
             buffer.getSpanStart(link[0]), 
             buffer.getSpanEnd(link[0])); 
          } 
          return true; 
         } 
        } 

       } 
       return false; 
      } 

      @Override 
      public void setText(CharSequence text, BufferType type) { 
       super.setText(text, type); 
       this.setMovementMethod(null); 
      } 
     } 
Problemi correlati