Как указывает hariseldon78 выше, ни одно из этих решений не устраняет НАСТОЯЩУЮ проблему, которая определяет высоту строки элемента списка ДО ее отображения. У меня была та же проблема, так как я хотел масштабировать некоторые изображения до высоты строк элементов ListView и не хотел масштабировать их до фиксированного значения. Если тема вызывала изменение высоты текста в других частях моего макета строки, я хотел, чтобы высота была такой, чтобы в моей процедуре getView моего адаптера я мог соответствующим образом изменить размер bmap. Я боролся с проблемой, что getHeight и все измеренные высоты сообщают об нуле, пока строка не будет отображена. Для меня, увидев правильные высоты позже, было слишком поздно.
Мое решение состоит в том, чтобы создать onLayoutChangedListener() в первый раз через getView и только для строки 0. Слушатель сработает, как только getView для первой позиции (0) завершит выполнение, и в это время параметр «нижний» сообщит вам высота ряда. Я записываю это в пользовательскую переменную класса адаптера, чтобы она была доступна в качестве параметра высоты без необходимости повторного получения высоты.
Слушатель отменяет регистрацию как часть своего выполнения. Это обеспечивает правильную высоту для строк 1-N, но не для нулевой строки. Для нулевой строки я сделал что-то действительно неприятное. Мой слушатель снова вызвал getView для строки 0 после установки другой пользовательской переменной класса адаптера для управления рекурсией. Во второй раз, когда getView(0) запускается, он не будет настраивать прослушиватель и найдет допустимый параметр для высоты, с которым можно работать, и все в порядке.
Код ниже - не нужно говорить мне, насколько это УЖАСНО - если бы Android не пришлось так чертовски усложнять, чтобы определить, насколько большим является представление, которое я создаю, когда я закончу заполнение представления на основе параметров рендеринга для поверхность Мне не пришлось бы делать это безобразие, но это работает. Извините, если форматирование кода ужасно...
int mHeight = 0;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
... usual boiler plate stuff
// JUST THE FIRST TIME
if (position == 0 && mHeight == 0) {
final View ref = convertView;
convertView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
public void onLayoutChange(View v, int left, int top, int right,
int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
ref.removeOnLayoutChangeListener(this);
mHeight = bottom;
firstTime = false;
// NOW LETS REGET THE FIRST VIEW WITH THE HEIGHT CORRECT
int visiblePosition = getListView().getFirstVisiblePosition();
View view = getListView().getChildAt(0 - visiblePosition);
getListAdapter().getView(0, view, getListView());
// RECURSION LOL
}
});
}
// Configure the view for this row
....
// HOW BIG IS THE VIEW?
// NOW IF NOT FIRSTTIME (MHEIGHT != 0)
if (mHeight != 0) {
// DO OUR IMAGE SETUP HERE CAUSE mHeight is RIGHT!
Log.d(TAG, "mHeight=" + mHeight);
}
return convertView;
}
person
Mike Kogan
schedule
05.01.2014