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

Я использую 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. Если вы должны использовать оба варианта, тогда вручную установите свойства от одного к другому, где это применимо (хотя я не могу думать о причине, по которой вам нужно будет использовать оба).