设置图库中元素的布局参数

mgv*_*mgv 9 android android-gallery android-layout

我用a Gallery来显示事件的水平时间轴.有些事件可以得到Gravity.TOP,有些Gravity.BOTTOM可以将它们对齐在显示年份的漂亮线上方或下方.到现在为止还挺好.

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

每个元素都Gallery包含在a上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();
Run Code Online (Sandbox Code Playgroud)

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

Ido*_*lon 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>
Run Code Online (Sandbox Code Playgroud)

然后,您可以在适配器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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,内部布局必须使用LinearLayout.LayoutParams(it extends ),否则将无法工作。MarginLayoutParams