检测ListView中的TextView是否被椭圆化

我有一个自定义适配器呈现ListView中的一些项目。 我需要在ListView的项目上显示一个图标,如果项目的文本是椭圆化的,并且如果有足够的空间让文本完成,就隐藏它。 我可以访问我的适配器(我设置文本)的getView方法中的button,但设置文本时不会立即添加省略号。

有什么办法可以做到这一点?

这是我的TextView标记:

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

Solutions Collecting From Web of "检测ListView中的TextView是否被椭圆化"

public int getEllipsisCount(int line) :

返回要省略的字符数,如果不发生省略号,则返回0。

所以,只需调用:

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

由于在设置布局之前不能调用getLayout(),所以使用ViewTreeObserver来查找加载文本视图的时间:

 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"); } } }); 

最后,不要忘记当你需要nomore时删除removeOnGlobalLayoutListener

棘手的部分是,你在getView使用的视图有时会被布置,有时候不会,所以你必须处理这两种情况。

当它没有被布置时,你设置一个视图树观察者来查看省略号。 在回收视图的情况下,布局将已经在那里,您可以在设置文本后立即检查省略号。

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

我希望我能正确理解你的问题 – 如果你想要结束一个TextView对于一个带有省略号的屏幕太宽,你可以将这些属性添加到你的TextView

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

但是,如果要确定TextView是以省略号结束还是完全显示,我不太确定这是否可能 – 看起来不是这样。 不过,您可能想要尝试TextViewgetEllipsize()方法。 我不确定这是否会返回TextView的偏移位置,或者将TextView设置为省略号。

您可以将您的文字设置为marque。 在你的代码中添加这可能会帮助…..

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

你也可以把你的代码水平滚动视图….

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