Настройка параметров макета для элемента внутри галереи - PullRequest
9 голосов
/ 02 мая 2011

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

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

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

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

<?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) для внутреннего макета, иначе он не будет работать.

0 голосов
/ 04 мая 2011

Gallery.LayoutParams - это совершенно другой класс, нежели android.view.ViewGroup.LayoutParams.

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

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

...