Определить, является ли TextView в ListView эллипсированным
У меня есть пользовательский адаптер, который отображает некоторые элементы в ListView. Мне нужно показать значок в элементах ListView, если текст элемента является эллипсированным и скрыть его, если есть достаточно места для завершения текста. У меня есть доступ к кнопке в методе getView моего адаптера (где я устанавливаю текст), но эллипсы не добавляются сразу после установки текста.
Можно ли мне это сделать?
Здесь моя разметка TextView:
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:id="@+id/list_item_description"/>
Ответы
Ответ 1
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");
}
}
});
И, наконец, не забудьте удалить removeOnGlobalLayoutListener, когда вам это нужно.
Ответ 2
Сложная часть состоит в том, что представление, с которым вы работаете в 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 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 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;
}
Ответ 3
Надеюсь, я правильно поняла ваш вопрос. Если вы хотите положить конец TextView
, который слишком широк для экрана с эллипсами, вы можете добавить эти атрибуты в свой TextView
:
android:ellipsize="end"
android:maxLines="1"
android:scrollHorizontally="true"
Если, однако, вы хотите определить, заканчивается ли TextView
с помощью многоточия или отображается полностью, я не уверен, что это возможно - он не выглядит так, как есть. Тем не менее, вы можете попробовать использовать метод getEllipsize()
TextView
. Я не уверен, вернет ли это то место, где TextView эллипсируется Android, или где вы установили, что TextView является эллипсированным.
Ответ 4
Вы можете либо настроить свой текст на маркеры.
добавьте это в свой код, возможно, поможет.....
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>