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

时间:2011-05-02 14:19:07

标签: android android-layout android-gallery

我使用Gallery来显示事件的水平时间轴。一些事件得到Gravity.TOP和一些Gravity.BOTTOM以使它们在显示年份的漂亮线的上方或下方对齐。到目前为止,非常好。

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

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();

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

2 个答案:

答案 0 :(得分:4)

  

图库的每个元素都包含LinearLayout

使用其他LinearLayout将其换行,并在内部LinerLayout.LayoutParams的{​​{1}}中设置边距。我检查了它,它似乎做你想要的。

因此,您为Gallery项目扩充的布局应如下所示:

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并根据您的条件设置边距(没有convertView重用优化的示例代码):

getView

请注意,您必须使用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)进行内部布局,否则无法使用。

答案 1 :(得分:-2)

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

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

尝试使用android.view.ViewGroup.LayoutParams而不是Gallery.LayoutParams。如果你必须同时使用它们,那么在适用的情况下手动将属性从一个设置为另一个(尽管我不能想到你需要同时使用它们的原因)。