Определить, является ли TextView в ListView многоточием

#android #android-layout #android-listview #textview

#Android #android-layout #android-listview #textview

Вопрос:

У меня есть пользовательский адаптер, который отображает некоторые элементы в 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. что вы сделали для многоточий?

2. Вы пробовали android: ellipsize .

3. добавлена часть, связанная с моим TextView

Ответ №1:

public int getEllipsisCount (строка int):

Возвращает количество символов, которые нужно убрать с многоточием, или 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, когда вам это больше не понадобится.

Ответ №2:

Сложность заключается в том, что представление, с которым вы работаете в getView , иногда будет выложено, а иногда нет, поэтому вам придется обрабатывать оба случая.

Если оно не было выложено, вы настраиваете view tree observer для проверки многоточия, как только оно было установлено. В случае переработанных представлений макет уже будет там, и вы можете проверить наличие многоточия сразу после установки текста.

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

Комментарии:

1. Часть, где мы проверяем уже выложенный TextView, похоже, не работает. Протестировано на Android emulator api 23.

Ответ №3:

Надеюсь, я правильно понял ваш вопрос — если вы хотите завершить TextView слишком широкий для экрана экран многоточиями, вы можете добавить эти атрибуты в свой TextView :

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

Однако, если вы хотите определить, заканчивается ли TextView многоточием или отображается полностью, я не уверен, что это возможно — похоже, что это не так. Тем не менее, вы можете попробовать getEllipsize() метод TextView . Я не уверен, возвращает ли это точку, в которой TextView имеет эллиптический размер Android, или где вы установили, что TextView имеет эллиптический размер.

Ответ №4:

Вы можете либо присвоить своему тексту значение marque. возможно, поможет добавление этого в ваш код…..

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

Вы также можете поместить горизонтальный scrollview для своего кода….

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

Комментарии:

1. Ни одно из ваших предложений не затрагивает вопрос, который задал Хади, и именно поэтому свойство ellipsize не демонстрировало ожидаемого поведения. Вместо этого они решают другую проблему (и HorizontalScrollView предложение особенно плохое).