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)
关于如何克服这个问题的任何想法或提示?
画廊的每个元素都包含在
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
| 归档时间: |
|
| 查看次数: |
6327 次 |
| 最近记录: |