【发布时间】:2015-11-11 22:17:45
【问题描述】:
我想将我的 gridview 设置为具有屏幕宽度/行数平方大小的单元格。我从网上下载的图片有问题。我可以在 XML 中对其进行硬编码,并且一切正常,但是我需要每个布局尺寸的尺寸。有两种图像视图,一种是如果图像本身不是正方形,则具有背景图块。我似乎无法找到如何在代码中动态设置它。我尝试设置最小高度,并尝试设置布局以填充父级,然后在膨胀时设置图像视图的大小。从一开始它的大小就合适了,或者它失败了,看起来..
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview_parent"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/element_spacing"
android:paddingTop="@dimen/element_spacing"
android:layout_centerHorizontal="true"
>
<ImageView
android:id="@+id/gridview_adapter_background_iv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="@dimen/element_spacing"
android:background="@color/color_primary"
android:contentDescription="@string/content_description_ui"
/>
<ImageView
android:id="@+id/gridview_adapter_iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/element_spacing"
android:layout_centerInParent="true"
android:contentDescription="@string/content_description_result"
/>
<ProgressBar
android:id="@+id/grid_adapter_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
</RelativeLayout>
获取视图..
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ImageDataViewHolder imageDataViewHolder;
/*
* see if we need to inflate the view, or if we can make use of the view holder pattern
*/
if (convertView == null) {
convertView = inflater.inflate(R.layout.adapter_gridview, parent, false);
imageDataViewHolder = new ImageDataViewHolder();
imageDataViewHolder.gridview_adapter_iv = (ImageView) convertView.findViewById(R.id.gridview_adapter_iv);
imageDataViewHolder.gridview_adapter_background_iv = (ImageView) convertView.findViewById(R.id.gridview_adapter_background_iv);
imageDataViewHolder.grid_adapter_spinner = (ProgressBar) convertView.findViewById(R.id.grid_adapter_spinner);
} else {
imageDataViewHolder = (ImageDataViewHolder) convertView.getTag();
}
/*
* Set the UI elements, reset the spinner
*/
imageDataViewHolder.position = position;
imageDataViewHolder.grid_adapter_spinner.setVisibility(View.VISIBLE);
final String url = mValues.get(position).getUrl();
imageDataViewHolder.gridview_adapter_iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mCallbacks.click(url);
}
});
convertView.setTag(imageDataViewHolder);
/*
* Process the bitmap. If it exists, set it. If not, create a volley request to try to access
* it. If it succeeds, save the bitmap to the cache. If it fails put up error icon.
*/
Bitmap bm = mCache.get(url);
if (bm != null) {
imageDataViewHolder.gridview_adapter_iv.setImageBitmap(bm);
imageDataViewHolder.grid_adapter_spinner.setVisibility(View.INVISIBLE);
} else {
imageDataViewHolder.gridview_adapter_iv.setImageBitmap(null);
ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
mCache.put(url, response);
/*
* Check to make sure its the same view is visible before making edits.
* Else we will get a flicker effect as different images are downloaded.
*
*/
if (imageDataViewHolder.position == position) {
imageDataViewHolder.gridview_adapter_iv.setImageBitmap(response);
imageDataViewHolder.grid_adapter_spinner.setVisibility(View.INVISIBLE);
}
}
}, mSize, mSize, null, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
imageDataViewHolder.grid_adapter_spinner.setVisibility(View.INVISIBLE);
imageDataViewHolder.gridview_adapter_iv.setImageResource(R.drawable.ic_error_outline_white_24dp);
}
});
mVolleySingleton.addRequest(imageRequest);
}
return convertView;
}
【问题讨论】:
-
使用以下解决方案或考虑这个:stackoverflow.com/questions/29956014/…
-
这就是我想知道我是否接近这个错误的地方。只是添加不同的布局会杀了我吗?我遇到的问题是我没有超过 2 个屏幕可供尝试..
-
您可以将模拟器用于您想要的每个屏幕。
-
我从经验中了解到永远不能使用模拟器代替真实设备。但我明白你的意思。
-
我决定我应该以正确的方式来做,并创建 5 个不同的尺寸文件。使用 S
dp(不是 sw)。然后我将每个网格项的高度设置为 1/2 SW。我以 1/2 屏幕尺寸 ^2 的最大尺寸下载图像。尝试以编程方式使其动态化和缩放对于与远程数据配对的 gridview 来说并不是一个好主意。我还让背景图像视图的宽度大于屏幕尺寸,以防止其间距不一致,网格视图的缩放将其缩小到正确的宽度。