Intereting Posts
Как изменить высоту кнопки «Войти в систему с помощью Facebook»? Android: Ошибка установки: INSTALL_FAILED_INSUFFICIENT_STORAGE Есть ли какая-либо информационная база данных, в которой перечислены все мобильные устройства и спецификации? Есть ли способ заставить EditText начать печатать в верхнем левом углу EditText? Преобразование из строки в json object android Как скрыть клавиатуру при запуске активности Фильтр намерений Android для определенного расширения файла? Изменение цвета текста панели приложений Google Place Picker Как установить разные темы для раздутого макета в виде заглушки Как я могу заставить давление памяти для отладки Android? Как я могу разблокировать экран программно в Android? Невозможно найти параметр модуля импорта в структуре проекта (Android Studio 0.3.4 – 0.5.2) Выравнивание макета стола Android Работа с устаревшим android.text.ClipboardManager Прямоугольные координаты с учетом угла поворота

Элемент с фиксированной высотой Android ListView

Возникла небольшая проблема. Я хотел бы создать активность просмотра списка андроидов со всеми элементами в списке с фиксированной высотой.

Итак, мой макет элемента (thread_item.xml) выглядит так:

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="300dip" > <TextView android:id="@+id/thread_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="[dummy]" android:textSize="20dip" android:textStyle="bold" /> <ImageView android:id="@+id/thread_first_image" android:layout_below="@id/thread_item_title" android:scaleType="centerInside" android:maxWidth="100dip" android:maxHeight="100dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" /> <TextView android:id="@+id/thread_item_preview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@id/thread_first_image" android:text="[dummy]" android:textSize="15dip"> </TextView> </RelativeLayout> 

Я устанавливаю layout_height корневого элемента в 300dip и ожидаю, что все элементы будут иметь одинаковую высоту, но они этого не делают. Когда я запускаю приложение, он выглядит как высота, имеющая значение wrap_content.

Кроме того, сама деятельность выглядит следующим образом:

 public class ThreadListActivity extends ListActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* Code to get items from the storage. */ setListAdapter(new ThreadItemAdapter(this, R.layout.thread_item, itemsArray))); getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { /*Start new Activity. Unrelated stuff.*/ } }); } } 

А адаптер, который я использую, выглядит так:

 public class ThreadItemAdapter extends ArrayAdapter<ThreadItem> { Activity context; List<ThreadItem> items; public ThreadItemAdapter(Activity context, int textViewResourceId, List<ThreadItem> items) { super(context, textViewResourceId, items); this.context = context; this.items = items; } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inf = this.context.getLayoutInflater(); View result; if (convertView == null) { result = inf.inflate(R.layout.thread_item, null); } else { result = convertView; } TextView tbTitle = (TextView) result.findViewById(R.id.thread_item_title); TextView tbPreview = (TextView) result.findViewById(R.id.thread_item_preview); ImageView ivFirstImage = (ImageView) result.findViewById(R.id.thread_first_image); ThreadItem item = items.get(position); tbTitle.setText(item.getThreadTitle()); ivFirstImage.setImageBitmap(item.getFirstImage()); SimpleLeadingMarginSpan span = new SimpleLeadingMarginSpan(item.getFirstImage() != null ? 5 : 0, 115); // TODO: const SpannableString previewText = new SpannableString(item.getThreadPreview()); previewText.setSpan(span, 0, previewText.length(), 0); tbPreview.setText(previewText); return result; } } 

Я не понимаю, почему все элементы списка все еще обертывают свой контент и не остаются 300dip в высоту. Они могут быть как меньшими, так и большими, чем 300dip. Я использую Android 2.3.3, тестирование на HTC Evo 3D-устройстве и эмулятор (оба показывают тот же результат).

Заранее большое спасибо.

UPD:

Благодаря Мигелю и Сэму. Решение состоит в том, чтобы установить maxHeight в textView, что увеличит мой элемент списка (это будет +id/thread_item_preview ) и установит minHeight RelativeLayout на 300dip, чтобы предотвратить его сокращение.

Solutions Collecting From Web of "Элемент с фиксированной высотой Android ListView"

Что делать, если вы изменяете все высоты дочернего представления в строке от wrap_content до match_parent ?


Из комментариев

Вы пробовали minHeight и maxHeight ? Например:

 android:minHeight="300dp" 

Вы также должны посмотреть, как Romain Guy Android обсуждает эффективность адаптеров и getView() .

При раздувании для convertView вместо просто

 result = inf.inflate(R.layout.thread_item, null); 

делать

 result = inf.inflate(R.layout.thread_item, parent, false); 

Этот метод – это inflater.inflate(int viewId, ViewGroup parent, boolean attachToRoot) – потому что вы не inflater.inflate(int viewId, ViewGroup parent, boolean attachToRoot) (который в этом случае является ListView), независимо от того, какое измерение, которое вы предоставили элементу listview, будет по умолчанию Должен быть установлен в layout_width = fill_parent, layout_height = wrap_content, игнорируя высоту 300dip, указанную в xml. Предоставляя родительское представление и передавая false , надуватель будет оценивать высоту 300dip, не привязывая его к корню (родительскому).

Попробуйте изменить это

 android:layout_height="300dip" 

в

 android:minHeight="300dip" 

Это работало для меня с использованием ExpandableListView, поэтому я полагаю, что это сработает для этого случая.

Вы можете добиться этого, указав тот же размер для Min и Max. Это устранило мою проблему.

 <ImageView android:id="@+id/appIconImageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginBottom="8dp" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" android:adjustViewBounds="true" android:maxHeight="50dp" android:maxWidth="50dp" android:minHeight="50dp" android:minWidth="50dp" android:src="@drawable/ic_launcher" /> 

Введите описание изображения здесь

Попробуйте настроить содержание TextView на высоту до 0dp а затем установите для параметра layout_alignParentBottom значение true .

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:minHeight="60dp" android:layout_height="match_parent" android:orientation="horizontal" android:gravity="center" android:weightSum="1" android:background="@color/main_color"> <ImageView android:id="@+id/img_left_menu" android:layout_weight="0.4" android:focusable="false" android:maxHeight="50dp" android:maxWidth="50dp" android:minHeight="50dp" android:minWidth="50dp" android:layout_width="0dp" android:scaleType="centerInside" android:adjustViewBounds="true" android:layout_height="wrap_content"/> <TextView android:id="@+id/tx_left_menu" android:layout_width="0dp" android:textSize="18dp" android:layout_gravity="center_vertical" android:layout_weight="0.6" android:singleLine="true" android:layout_height="wrap_content" android:focusable="false" /> </LinearLayout> 

Если я не ошибаюсь, listView автоматически изменяет LayoutParams пользовательского представления на wrap_content, wrap_content. Однако приведенные выше ответы верны, если вы установите minHeight или minWidth, он будет работать блестяще.