Android - GridView 图像在方向更改后无法正确显示
Android - GridView image not displaying correctly after orientation change
在我的 Android 应用程序中,我在 GridView 中显示照片。在将这些照片加载到 GridView 之前,我对这些照片进行了一些繁重的处理,因此我决定通过覆盖 onConfigurationChanged() 方法自行处理配置更改,该方法仅更改 GridView 的列数,然后将适配器重新分配给它。
当我将设备从横向切换到纵向时,一切正常,并且图像按预期占据了整列 space。
但是当我将设备从纵向切换到横向时,GridView 中图像的宽度比需要的要小很多。
我正在使用 Glide 库将照片加载到 GridView 中。
我该如何解决这个问题?
我的代码如下:
public class PhotosAdapter extends BaseAdapter {
private ArrayList<String> images;
public PhotosAdapter(ArrayList<String> images) {
this.images = images;
}
@Override
public int getCount() {
return images.size();
}
@Override
public Object getItem(int position) {
return images.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null) {
//No tenemos vista reciclada, la creamos
row = getLayoutInflater().inflate(R.layout.grid_row, parent, false);
}
TickedImageView thumbV = (TickedImageView) row.findViewById(R.id.thumb);
int screenWidth = getResources().getDisplayMetrics().widthPixels;
int numberOfColumns = Utils.landscape(PhotosActivity.this) ? 5 : 3;
int width = screenWidth / numberOfColumns;
thumbV.setDrawingWidth(width);
//Por si la TickedImageView fue reciclada, la desmarcamos
thumbV.setSelected(selectedPaths.contains(images.get(position)));
thumbV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TickedImageView view = (TickedImageView) v;
if (view.isSelected())
selectedPaths.add(images.get(position));
else
selectedPaths.remove(images.get(position));
}
});
//Cargamos la imagen
Glide.with(PhotosActivity.this)
.load(new File(images.get(position)))
.centerCrop()
.into(thumbV);
Log.d("TAG", images.get(position));
return row;
}
public void removeImage(String image) {
images.remove(image);
}
public String getImage(int position) {
return images.get(position);
}
}
我想你可能遇到了this issue,尝试在XML中将ImageView大小设置为match_parent
,并在GridView上设置列数,不需要自定义drawingWidth
。 Android 布置 GridView 和 Glide 的布局系统应处理其余部分。
小提示:由于协变 return 类型,您可以说 public String getItem
,没有重复的 getImage
.
尝试为横向模式创建单独的布局并配置 no。 Grid 的列为
纵向模式下 1 + no.Of 列。
另外,为您的 imageView 设置 scaleType = centerCrop
Android 会处理剩下的事情。
在我的 Android 应用程序中,我在 GridView 中显示照片。在将这些照片加载到 GridView 之前,我对这些照片进行了一些繁重的处理,因此我决定通过覆盖 onConfigurationChanged() 方法自行处理配置更改,该方法仅更改 GridView 的列数,然后将适配器重新分配给它。 当我将设备从横向切换到纵向时,一切正常,并且图像按预期占据了整列 space。 但是当我将设备从纵向切换到横向时,GridView 中图像的宽度比需要的要小很多。 我正在使用 Glide 库将照片加载到 GridView 中。
我该如何解决这个问题?
我的代码如下:
public class PhotosAdapter extends BaseAdapter {
private ArrayList<String> images;
public PhotosAdapter(ArrayList<String> images) {
this.images = images;
}
@Override
public int getCount() {
return images.size();
}
@Override
public Object getItem(int position) {
return images.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
if(row == null) {
//No tenemos vista reciclada, la creamos
row = getLayoutInflater().inflate(R.layout.grid_row, parent, false);
}
TickedImageView thumbV = (TickedImageView) row.findViewById(R.id.thumb);
int screenWidth = getResources().getDisplayMetrics().widthPixels;
int numberOfColumns = Utils.landscape(PhotosActivity.this) ? 5 : 3;
int width = screenWidth / numberOfColumns;
thumbV.setDrawingWidth(width);
//Por si la TickedImageView fue reciclada, la desmarcamos
thumbV.setSelected(selectedPaths.contains(images.get(position)));
thumbV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TickedImageView view = (TickedImageView) v;
if (view.isSelected())
selectedPaths.add(images.get(position));
else
selectedPaths.remove(images.get(position));
}
});
//Cargamos la imagen
Glide.with(PhotosActivity.this)
.load(new File(images.get(position)))
.centerCrop()
.into(thumbV);
Log.d("TAG", images.get(position));
return row;
}
public void removeImage(String image) {
images.remove(image);
}
public String getImage(int position) {
return images.get(position);
}
}
我想你可能遇到了this issue,尝试在XML中将ImageView大小设置为match_parent
,并在GridView上设置列数,不需要自定义drawingWidth
。 Android 布置 GridView 和 Glide 的布局系统应处理其余部分。
小提示:由于协变 return 类型,您可以说 public String getItem
,没有重复的 getImage
.
尝试为横向模式创建单独的布局并配置 no。 Grid 的列为 纵向模式下 1 + no.Of 列。 另外,为您的 imageView 设置 scaleType = centerCrop Android 会处理剩下的事情。