我使用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();
关于如何克服这个问题的任何想法或提示?
答案 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。如果你必须同时使用它们,那么在适用的情况下手动将属性从一个设置为另一个(尽管我不能想到你需要同时使用它们的原因)。