studio personalizado item example ejemplo custom android listview textview

personalizado - Android: ListView no recibe OnItemClick para vista de texto con enlaces en los que se puede hacer clic



listview android studio example (5)

Tengo un ListView que contiene un TextView en cada fila, además de una serie de otras vistas. TextView muestra contenido html que puede contener enlaces.

El siguiente código aparece en la lista del adaptador. m_textview.setMovementMethod (LinkMovementMethod.getInstance ()); m_textview.setText (Html.fromHtml (myhtmlcontent));

Sin embargo, esto hace que la vista de lista ya no reciba eventos de clic. Decidí poner la lista en el código de clic en la vista que devuelve el adaptador. Esto no funciona del todo como se desea. Ahora puedo iniciar otra actividad cuando hago clic en cualquier lugar de la fila, excepto en la vista de texto. Quiero que los usuarios puedan hacer clic en la parte sin enlaces de la vista de texto y lanzar otra actividad.

Si muevo el onclick a la vista de texto en lugar de a la vista principal, funciona, pero ahora un clic en el enlace dispara dos eventos: uno para el clic en el enlace y otro para la vista de texto (que no se desea).

Me he dado cuenta de que google + y peep en Android funcionan de la manera que quiero. No estoy seguro de cómo se puede lograr eso.


Las vistas enfocadas dentro de un elemento de ListView deshabilitarán la posibilidad de seleccionar elementos de ListView. La aplicación de android:focusable="false" a TextView permitirá que OnItemClick vuelva a funcionar. Es posible que también deba aplicar android:focusableInTouchMode="false" para hacer que la bola de seguimiento ignore los enlaces porque hacer clic en la bola de seguimiento sobre un elemento enfocable en un ListView puede hacer clic en el enlace y en el elemento ListView.


Puede adjuntar en la vista de lista un setOnItemClickListener.


TextView que solo responde a eventos táctiles de enlaces. Basado en https://.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); } }


Tuve el mismo problema y ninguna de estas respuestas funcionó para mí. Finalmente, logré solucionar el problema eliminando el atributo android:inputType="textMultiLine" .


Esto es realmente un BUG . Para resolver esto puedes agregar android:descendantFocusability="blocksDescendants" a tu xml de diseño de ListView''s . Por ejemplo

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

Fuente: BUG y this

Buena suerte :)