9

我正在使用 aGallery来显示事件的水平时间线。一些事件得到Gravity.TOP,一些事件Gravity.BOTTOM将它们对齐在显示年份的漂亮线条之上或之下。到现在为止还挺好。

我想更改顶部元素的左边距属性,因此没有巨大的间隙并且元素看起来交错。例如:为每个在顶部对齐的元素设置负左边距。

的每个元素都Gallery包含在 a 上LinearLayout,可以设置一个MarginLayoutParams实例来以编程方式更改边距。但是,我在适配器内部ClassCastException使用时得到了一个,因为画廊代码这样做:MarginLayoutParams

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

关于如何克服这个问题的任何想法或提示?

4

2 回答 2

4

画廊的每个元素都包含在一个LinearLayout

只需使用另一个包装它并在内部LinearLayout设置边距。我已经检查过了,它似乎做了你想要的。LinerLayout.LayoutParamsLinearLayout

所以你为画廊项目膨胀的布局应该是这样的:

<?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>

然后您可以在适配器getView方法中访问内部 LinearLayout 并根据您的条件在那里设置边距(示例代码没有 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(it extends MarginLayoutParams) 进行内部布局,否则将无法正常工作。

于 2011-05-05T11:11:45.633 回答
-2

Gallery.LayoutParams 是一个与 android.view.ViewGroup.LayoutParams 完全不同的类。

您的子视图(从适配器构建)是一个返回 android.view.ViewGroup.LayoutParams 的 LinearLayout,而 Gallery 返回一个 Gallery.LayoutParams。

尝试使用 android.view.ViewGroup.LayoutParams 而不是 Gallery.LayoutParams。如果您必须同时使用两者,则在适用的情况下手动将属性从一个设置为另一个(尽管我真的想不出您需要同时使用两者的原因)。

于 2011-05-04T19:11:10.883 回答