Intereting Posts
Заполненная активность ADT, созданная с использованием фрагментов. Ошибка при импорте проекта андроида («Неверное местоположение» или «Причина: неожиданный конец данных блока») Уведомление GCM push. Сообщено плохое уведомление – не удалось расширить RemoteViews для: StatusBarNotification Можете ли вы отключить полноэкранное редактирование в ландшафте в React Native Android? Используйте библиотеку DataBinding для установки ресурса цвет фона или нулевого Разница между объявлением и стилем Кнопка Ok для диалога оповещений на Android Андроид Java-примитивные типы: int vs. Integer Android sp vs dp text – что бы регулировать «масштаб» и что является философией поддержки Протирать данные / Сбросить заводские данные через ADB Получение отклонений от заданного маршрута Google Maps? Html phonegap android: цифровая клавиатура имеет следующую, а не кнопку go Android Volley делает 2 запроса на сервер, когда для политики повторных попыток установлено значение 0 Как получить количество предметов в прядильщике?

Настройка параметров макета для элемента внутри галереи

Я использую Gallery для отображения горизонтальной временной шкалы событий. Некоторые из событий получают Gravity.TOP и некоторые Gravity.BOTTOM чтобы выровнять их выше или ниже красивой строки, отображающей годы. Все идет нормально.

Я хочу изменить свойство left margin элементов в верхней части, поэтому нет больших пробелов, и элементы выглядят чередующимися. Например: установка отрицательного левого поля для каждого элемента, выровненного сверху.

Каждый элемент Gallery состоит из LinearLayout , который может быть создан для экземпляра MarginLayoutParams для изменения программ программно. Тем не менее, я получаю ClassCastException при использовании MarginLayoutParams внутри адаптера, потому что код Gallery делает это:

  // Respect layout params that are already in the view. Otherwise // make some up... Gallery.LayoutParams lp = (Gallery.LayoutParams) child.getLayoutParams(); 

Любые идеи или подсказки о том, как преодолеть эту проблему?

Solutions Collecting From Web of "Настройка параметров макета для элемента внутри галереи"

Каждый элемент галереи состоит из LinearLayout

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

Таким образом, макет, который вы надуваете для элемента Gallery, должен выглядеть следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layOuter" android:layout_width="wrap_content" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/layInner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/imageView1" android:src="@drawable/icon" android:layout_height="wrap_content" android:layout_width="wrap_content" android:scaleType="fitXY" /> <TextView android:text="TextView" android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="visible" /> </LinearLayout> </LinearLayout> 

Затем вы можете получить доступ к внутреннему LinearLayout в методе getView адаптера и установить маржу там в зависимости от ваших условий (пример кода без оптимизации повторного использования convertView):

 public View getView(int position, View convertView, ViewGroup parent) { Context context = getContext(); final float density = context.getResources().getDisplayMetrics().density; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layOuter = inflater.inflate(R.layout.row_layout, null); View layInner = layOuter.findViewById(R.id.layInner); if (...) { // your condition LinearLayout.LayoutParams innerLP = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); innerLP.leftMargin = (int) (50 * density); layInner.setLayoutParams(innerLP); } return layOuter; } 

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

Gallery.LayoutParams – это совсем другой класс, чем андроид.view.ViewGroup.LayoutParams.

Вид вашего ребенка (построенный из адаптера) – это LinearLayout, который возвращает android.view.ViewGroup.LayoutParams, тогда как Галерея возвращает Gallery.LayoutParams.

Попробуйте использовать android.view.ViewGroup.LayoutParams вместо Gallery.LayoutParams. Если вы должны использовать оба варианта, тогда вручную установите свойства от одного к другому, где это применимо (хотя я не могу думать о причине, по которой вам нужно будет использовать оба).