Detectar si TextView en ListView está ellipsizado

Tengo un adaptador personalizado que procesa algunos elementos en un ListView. Necesito mostrar un icono en los elementos de ListView, si el texto del elemento es elipsis, y ocultarlo si hay suficiente espacio para que el texto termine. Tengo acceso al botón en el método getView de mi adaptador (donde establecí el texto), pero las elipses no se agregan inmediatamente al configurar el texto.

¿Hay alguna manera de que pueda hacer esto?

Aquí está mi marcado de TextView:

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleLine="true" android:id="@+id/list_item_description"/> 

Public int getEllipsisCount (línea int) :

Devuelve el número de caracteres a elipsar, o 0 si no hay elipsis.

Por lo tanto, simplemente llame a:

 if(textview1.getLayout().getEllipsisCount() > 0) { // Do anything here.. } 

Puesto que no se puede llamar a getLayout () antes de que se establezca el diseño, utilice ViewTreeObserver para encontrar cuando se carga la vista de texto:

 ViewTreeObserver vto = textview.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout l = textview.getLayout(); if ( l != null){ int lines = l.getLineCount(); if ( lines > 0) if ( l.getEllipsisCount(lines-1) > 0) Log.d(TAG, "Text is ellipsized"); } } }); 

Y finalmente no se olvide de quitar removeOnGlobalLayoutListener cuando lo necesite nomore.

La parte difícil es que la vista que está trabajando en getView a veces se ha establecido, ya veces no, por lo que tiene que manejar ambos casos.

Cuando no ha sido establecido, usted fija un observador del árbol de la visión para comprobar en las elipsis una vez que ha sido. En el caso de las vistas recicladas, el diseño ya estará allí y podrá comprobar las elipsis inmediatamente después de configurar el texto.

 public View getView(int position, View convertView, ViewGroup parent) { final ViewHolder vh; if (convertView == null) { vh = new ViewHolder(); ... // create/inflate view and populate the ViewHolder } vh = (ViewHolder) convertView.getTag(); // Set the actual content of the TextView vh.textView.setText(...); // Hide the (potentially recycled) expand button until ellipsizing checked vh.expandBtn.setVisibility(GONE); Layout layout = vh.textView.getLayout(); if (layout != null) { // The TextView has already been laid out // We can check whether it's ellipsized immediately if (layout.getEllipsisCount(layout.getLineCount()-1) > 0) { // Text is ellipsized in re-used view, show 'Expand' button vh.expandBtn.setVisibility(VISIBLE); } } else { // The TextView hasn't been laid out, so we need to set an observer // The observer fires once layout's done, when we can check the ellipsizing ViewTreeObserver vto = vh.textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Layout layout = vh.textView.getLayout(); if (layout.getEllipsisCount(layout.getLineCount()-1) > 0) { // Text is ellipsized in newly created view, show 'Expand' button vh.expandBtn.setVisibility(VISIBLE); } // Remove the now unnecessary observer // It wouldn't fire again for reused views anyways ViewTreeObserver obs = vh.textView.getViewTreeObserver(); obs.removeGlobalOnLayoutListener(this); } }); return convertView; } 

Espero que entienda su pregunta correctamente – si usted está mirando para terminar un TextView que sea demasiado ancho para una pantalla con elipses, usted puede agregar estos atributos a su TextView :

 android:ellipsize="end" android:maxLines="1" android:scrollHorizontally="true" 

Si, sin embargo, desea determinar si un TextView se termina con una elipsis o se muestra en su totalidad, no estoy tan seguro de que es posible – no parece que sea. Sin embargo, es posible que desee probar el método getEllipsize() de TextView . No estoy seguro si eso devuelve el punto en donde el TextView es ellipsized por Android, o donde usted ha fijado el TextView para ser ellipsized.

Puede configurar su texto para marcar. Agregar esto en su código podría ayudar …..

  android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:freezesText="true" android:marqueeRepeatLimit="marquee_forever" 

También puedes poner un scrollview horizontal para tu código ….

  <HorizontalScrollView android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/list_item_description" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" android:ellipsize="end" android:gravity="center_vertical" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> </HorizontalScrollView> 
  • Deslizar para desbloquear animación en Android
  • Desplazamiento automático de TextView en android para introducir texto en la vista
  • Cómo obtener el ancho del texto cuando el ajuste de varios spannable
  • ¿Cómo crear una animación cambiante de color? (Androide)
  • La vista de texto de Android no se enrolla correctamente
  • Cómo establecer el color del texto en una vista de texto mediante programación
  • ¿Cómo escalar / cambiar el tamaño del texto para que se ajuste a un TextView?
  • Textview dentro de RelativeLayout en la vista personalizada ¿No se aplica la gravedad correctamente?
  • TextView ampliar animación como en Android Market
  • Cómo dibujar correctamente texto en una clase extendida para TextView?
  • ¿Cómo modificar la propiedad MaxLines de TextView con animación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.