Невозможно установить поля элемента в ListView с помощью пользовательского адаптера

уваю RelativeLayout из XML, а затем пытаюсь программно установить его параметры макета и получаю ClassCastException.

Код:

profileHeader = (RelativeLayout)mInflater.inflate(R.layout.user_profile_header, null);
profileHeader.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT));

бросает

E/AndroidRuntime( 2963): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams
E/AndroidRuntime( 2963):  at android.widget.ListView.measureScrapChild(ListView.java:1119)
E/AndroidRuntime( 2963):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1202)
E/AndroidRuntime( 2963):  at android.widget.ListView.onMeasure(ListView.java:1111)
E/AndroidRuntime( 2963):  at android.view.View.measure(View.java:8222)
E/AndroidRuntime( 2963):  at android.view.ViewGroup.measureChildWithMargins(V

Я видел другие заметки в сети, чтобы попытаться использовать LinearLayout.LayoutParams, но это, похоже, не помогает.

Если вам интересно, почему я делаю это вообще, а НЕ просто устанавливаю это в XML, потому что я вижу что-то странное, когда макет «переходит» на перенос / перенос. Я установил его в fill_parent / fill_parent в XML и при прокрутке представление «сжимается» до того, что выглядит как обтекание / обтекание Это действительно странно. Глядя на исходный код Android в формате Foursquared, я нашел комментарий, в котором разработчик говорит то же самое:

«Что-то странное происходит с параметрами макета. Если мы явно не установим макет для заполнения / заполнения после надувания, макет переходит к макету с переносом / переносом». (FriendsActivity.java:258)

Это звучит как моя проблема, поэтому я пытаюсь сделать то же самое (установить макет с помощью кода), но в его случае он использует LinearLayout, тогда как я использую RelativeLayout.

Чего мне не хватает? Заранее спасибо.

Ответы на вопрос(1)

Решение Вопроса

если вы создаете RelativeLayout и добавляете его в ListView, параметры макета должны иметь тип ListView.LayoutParams, а не RelativeLayout.LayoutParams. Правильный способ сделать это - вызвать инфляцию следующим образом:

inflate (R.layout.mylayout, theListView, false);

Эта версия inflate () будет правильно раздувать параметры макета (android: layout_ *), определенные в XML.

 Cody Caughlan08 янв. 2011 г., 18:00
Спасибо, Ромен, это действительно отвечает на вопрос и позволяет мне устанавливать параметры RelativeLayout программно. К сожалению, я надеялся, что это решило бы мою проблему предотвращения «прыжка» вида к переносу / переносу при прокрутке (он заметно уменьшается при прокрутке, а затем возвращается к нормальному состоянию при отпускании). Но это не решило эту проблему. Очень странно.
 Romain Guy09 янв. 2011 г., 02:46
Я не могу помочь вам в этом втором вопросе без дополнительной информации о коде. Это действительно очень странно :)

Ваш ответ на вопрос