ListView setOnItemClickListener no desencadena cuando un elemento tiene un vínculo en ello

Estoy trabajando en la integración de Twitter en una aplicación y mientras todo funciona como debería, estoy setOnItemClickListener() en el setOnItemClickListener() no se activa cuando un item ListView tiene un enlace en él. Funciona muy bien cuando un item no tiene un enlace (URL) en él.

Al hacer clic en la URL se abre la página web en un navegador.

Consulte las capturas de pantalla agregadas como referencia al final de la publicación.

Es un ListView personalizado que emplea un BaseAdapter . No estoy seguro de qué pieza de código para poner en, pero en ser señalado a un bloque de código que la gente aquí puede necesitar, voy a añadir de inmediato.

La idea detrás de la necesidad de ignorar los enlaces (URL) de un elemento es proporcionar una funcionalidad que muestra los detalles del tweet cuando un usuario hace clic en uno. Algo similar a lo que hace la aplicación de Twitter de Android.

Entonces, ¿qué debo hacer para que el setOnItemClickListener() ignore los enlaces de los elementos?

ACTUALIZADO:

Bueno. Así que no estoy seguro de si es relevante para la pregunta, pero, a partir de una combinación de unas pocas soluciones de SO que me llevó al proyecto de código abierto TweetLanes , he logrado conseguir algunas cosas funcionando. Pero desafortunadamente, no aborda mi pregunta primaria.

¿Cómo puedo hacer que el setOnItemClickListener() ignore los enlaces en un elemento para que pueda hacer clic en él y mostrar los detalles en otra actividad y, sin embargo, al hacer clic en un enlace, no activar el setOnItemClickListener() ? Sigo recibiendo soluciones parciales en cada intento que hago. Pero a veces, cuando hago clic en un link , el setOnItemClickListener() también se activa.

Así es como el flujo mira el momento:

Introduzca aquí la descripción de la imagen

En las dos primeras capturas de pantalla, funciona como debería. No hacer clic en un enlace después de todo.

En la parte inferior dos, sin embargo, cuando hago clic en el enlace @ibnlive , muestra el perfil para el usuario ( @ibnlive ). Esta parte se deriva de la fuente TweetLanes. El problema es que el oyente de clics también se activa. Esta es una de las soluciones que estoy probando. En este caso, he comentado el setOnItemClickListener() y estoy usando un OnClickListener() en el TextView . Este es el método que tiene éxito parcial hasta ahora.

Probablemente quiera echar un vistazo a la respuesta de babay en ListView: TextView con LinkMovementMethod hace que el elemento de lista sea unclickable?

Él presenta un TextView que emite este problema básicamente introduciendo un LinkMovementMethod diferente:

 public static class LocalLinkMovementMethod extends LinkMovementMethod{ static LocalLinkMovementMethod sInstance; public static LocalLinkMovementMethod getInstance() { if (sInstance == null) sInstance = new LocalLinkMovementMethod(); return sInstance; } @Override public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 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(); Layout layout = widget.getLayout(); int line = layout.getLineForVertical(y); int off = layout.getOffsetForHorizontal(line, x); 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])); } if (widget instanceof TextViewFixTouchConsume){ ((TextViewFixTouchConsume) widget).linkHit = true; } return true; } else { Selection.removeSelection(buffer); Touch.onTouchEvent(widget, buffer, event); return false; } } return Touch.onTouchEvent(widget, buffer, event); } } 

Solución NO PROBADA

Basándome en esto, te aconsejo arreglar el archivo TwitterLinkify.java (la función que establece el movimiento del enlace) así:

 private static final void addLinkMovementMethod(TextView t) { MovementMethod m = t.getMovementMethod(); if ((m == null) || !(m instanceof LocalLinkMovementMethod)) { if (t.getLinksClickable()) { t.setMovementMethod(LocalLinkMovementMethod.getInstance()); } } } 

Gracias

Para respaldar los eventos de clics de listItem y los enlaces de soporte dentro de los registros, debes establecer android:descendantFocusability="blocksDescendants" en el diseño de nivel superior del xml de tu lista-registro.

¿Has probado el siguiente código (basado en este enlace ):

 textView.setMovementMethod(null); 

?


EDIT: aquí hay una solución de trabajo:

 textView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(final View v, final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { // <=handle clicking here } return true; } }); 

Eso es porque el enlace es clicable y listItem también se puede hacer clic, por lo que aquí, el enlace toma el foco y, por tanto, listItem no se puede hacer clic.

Sólo tiene que configurar:

Establecer todos los elementos de android:focusable="false"

Y android:focusableInTouchMode="false" de listItem.

Por favor, eche un vistazo a esto.

 text_url.setText(Html.fromHtml(url.toString().trim())); Linkify.addLinks(text_url, Linkify.ALL); 

Esta es la línea que estoy utilizando para mostrar la url en la vista de lista. Si usted hace las líneas antedichas en su getview el acoplamiento se convertirá en color azul con el subrayado automatically.if usted chasca ese uno que abrirá el browser automáticamente.

Espero que esto te ayudará.

EDITAR

Hola echa un vistazo a esta respuesta editada. Lo he verificado. Se abrirá la url correcta. Espero que esto te ayudará.

  String url="www.google.com"; String name="@sampleuser"; textview1.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+name+"</a>")); textview1.setMovementMethod(LinkMovementMethod.getInstance()); 

EDIT 2 Hola, eche un vistazo a esta muestra. Espero que esto te ayudará .

 package com.example.listwithclick; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.text.Html; import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; public class MainActivity extends Activity { ListView listView1; Activity activity; ArrayList<String>urls=new ArrayList<String>(); ArrayList<String>name=new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); activity=this; urls.add("www.google.com"); name.add("@googleuser"); urls.add("www.yahoo.com"); name.add("@yahoouser"); urls.add("www.facebook.com"); name.add("@facebookuser"); urls.add("www.linkedin.com"); name.add("@linkedinuser"); listView1=(ListView)findViewById(R.id.listView1); listView1.setAdapter(new MyAddapter(MainActivity.this)); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } class MyAddapter extends BaseAdapter { Context rContext; private LayoutInflater rInflater; public MyAddapter(Context c) { rInflater = LayoutInflater.from(c); rContext = c; } public MyAddapter(Activity imagebinding) { // TODO Auto-generated constructor stub activity = imagebinding; rContext = imagebinding; rInflater = LayoutInflater.from(imagebinding); rContext = imagebinding; rInflater = (LayoutInflater) activity .getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return urls.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub convertView = rInflater.inflate(R.layout.child, null); final MyDat mydat = new MyDat(); mydat.textview = (TextView) convertView.findViewById(R.id.textview_name); mydat.textview.setText(Html.fromHtml("<a href='http://"+urls.get(position).toString()+"'>"+name.get(position).toString()+"</a>")); mydat.textview.setMovementMethod(LinkMovementMethod.getInstance()); return convertView; } class MyDat { TextView textview; } } } 
  • Salir o cambiar cuentas usando Parse Twitter / Facebook Authentication
  • Aplicación para Android: agregar un botón de "compartir" para compartir la aplicación en redes sociales
  • Cómo subir imagen a twitter con android sdk
  • Message - Sus credenciales no permiten el acceso a este recurso. Código - 220
  • Iniciar aplicación twitter
  • ¿Cómo obtener información de usuario de twitter en la aplicación android?
  • Error de Qucikblox: para iniciar sesión en Android en Android
  • twitter4j alcanza la longitud máxima cuando envía la imagen con texto en android
  • ¿Por qué occure consumidor clave / par secreto ya establecido, IllegalStateException en mi aplicación android?
  • ¿Cómo tweet de la aplicación de Android?
  • Android envía mensajes directos de Twitter a través de la intención
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.