14

我有一個自定義的Adapter,它呈現ListView中的一些項目。我需要在ListView的項目上顯示一個圖標,如果該項目的文本是橢圓化的,並且在文本有足夠空間完成時將其隱藏。我可以訪問我的適配器(我設置文本)的getView方法中的按鈕,但設置文本時不會立即添加省略號。檢測ListView中的TextView是否被橢圓化

有什麼辦法可以做到這一點?

這裏是我的TextView標記:

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

你爲橢圓做了什麼? – 2011-05-02 09:34:43

+1

你有沒有試過[android:ellipsize](http://developer.android.com/reference/android/widget/TextView.html#attr_android:ellipsize)。 – Mudassir 2011-05-02 09:34:48

+0

添加了與我的TextView相關的部分 – 2011-05-02 09:39:40

回答

-1

您可以設置您的文字勞斯萊斯。 在你的代碼可能有助於增加這個.....

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

您的任何建議都不能解決Hadi提出的問題,這就是爲什麼ellipsize屬性未表現出預期行爲。相反,他們解決了另一個問題(並且'Horizo​​ntalScrollView'提議特別糟糕)。 – Phil 2012-11-20 20:00:14

1

我希望我明白你的問題correctly--如果你正在尋找結束TextView這太寬與橢圓的屏幕,你可以將這些屬性添加到您的TextView

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

如果豪ver,你想確定一個TextView是以省略號結束還是完全顯示,我不太確定這是否可能 - 它看起來不是這樣。不過,你可能想嘗試方法TextView。我不確定這是否會返回TextView被Android忽略的位置,或者you已將TextView設置爲省略號。

7

棘手的部分是,您在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; 
} 
+0

我們檢查的部分已經佈置了TextView,但似乎不起作用。經過Android模擬器API 23測試。 – vyndor 2015-10-11 18:48:40

13

public int getEllipsisCount (int line)

返回要ellipsized字符數遠,或0,如果沒有省略號是發生。

所以,只需撥打:

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

由於getLayout()不能被稱爲佈局設置之前,使用ViewTreeObserver發現當TextView中裝入:

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

而且終於不要忘記刪除removeOnGlobalLayoutListener當你需要它nomore。