我的基本布局是LinearLayouts的ListView,网格中的每个项目都是下面的FrameLayout。我正在将图像下载到ImageView。在加载图像之前,没有内容,并且布局缩小到小ProgressBar(第一个问题)的高度,当我期望它是240dp或120dp时。将图像放置在视图中后,布局不会调整(第二个问题),高度仍然是小型ProgressBar的缩小尺寸。
加载图片代码:
@Override
public View getView(View convertView) {
// ...
// set up holder
// ...
new GetPhotoTask().execute(holder.my_tile_image, holder.my_loading, my_media_url);
holder.my_tile_image.setVisibility(View.INVISIBLE);
holder.my_loading.setVisibility(View.VISIBLE);
holder.my_tile_label.setText(activityObject1.track.name);
// ...
}
private final class GetPhotoTask extends AsyncTask<Object, Void, Drawable> {
ImageView iv;
ProgressBar pb;
@Override
protected Drawable doInBackground(Object... params) {
iv = (ImageView) params[0];
pb = (ProgressBar) params[1];
return new BitmapDrawable(getResources(), loadAsset(params[2]).media_url, true));
}
@Override
protected void onPostExecute(Drawable result) {
super.onPostExecute(result);
pb.setVisibility(View.GONE);
iv.setImageDrawable(result);
iv.setVisibility(View.VISIBLE);
}
}
主xml:
<ListView
android:id="@+id/my_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp" />
每行的xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_row_type_3"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="240dp"
android:weightSum="3" >
<include layout="@layout/my_tile_layout"
android:id="@+id/my_tile_1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
<LinearLayout
android:id="@+id/my_row_type_2"
android:orientation="vertical"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:weightSum="2" >
<include layout="@layout/my_tile_layout"
android:id="@+id/my_tile_2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<include layout="@layout/my_tile_layout"
android:id="@+id/my_tile_3"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</LinearLayout>
行内容的xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/my_tile_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp" >
<ImageView
android:id="@+id/my_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:contentDescription="@string/foo" />
<ProgressBar
android:id="@+id/my_loading"
style="?android:attr/progressBarStyleSmall"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<TextView
android:id="@+id/my_tile_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/my_title"
android:layout_gravity="left|bottom" />
</FrameLayout>
为什么初始布局缩小到进度条的高度,即使我为每行硬编码240dp?为什么在ImageView内容中设置位图不会导致它在此时调整大小?第一个问题是最重要的,因为我相信它会使第二个问题无效。提前谢谢。
解
为了获得我想要的结构,我使用RelativeLayout作为图块(用于分层能力),并且对于每一行,我重写LinearLayout以强制执行我想为每一行设置的大小。由于每个磁贴的内容可能比视图更大或更小,这使我无法依赖centerCrop或fitCenter。因此,在我的自定义布局中,我将高度设置为与每行的宽度成比例,并将MeasureSpec的模式设置为完全。
public final class MyRow3 extends LinearLayout {
// ...
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, makeMeasureSpec(getSize(widthMeasureSpec) * 2 / 3, MeasureSpec.EXACTLY));
}
答案 0 :(得分:0)
我不确定为什么它不尊重它,但为什么不做这样的事情呢?
在ImageView中设置绝对高度以保证一些空间。
<ImageView
android:layout_height="###dp"
/>
然后在加载图像之前将布局更改回自动调整状态:
iv.setLayoutParams( new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT ) );
答案 1 :(得分:0)
为了获得我想要的结构,我使用RelativeLayout作为图块(用于分层能力),并且对于每一行,我重写LinearLayout以强制执行我想为每一行设置的大小。由于每个磁贴的内容可能比视图更大或更小,这使我无法依赖centerCrop或fitCenter。因此,在我的自定义布局中,我将高度设置为与每行的宽度成比例,并将MeasureSpec的模式设置为完全。
public final class MyRow3 extends LinearLayout {
// ...
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, makeMeasureSpec(getSize(widthMeasureSpec) * 2 / 3, MeasureSpec.EXACTLY));
}