【问题标题】:Android gridview Square elements?Android gridview Square元素?
【发布时间】: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 个不同的尺寸文件。使用 Sdp(不是 sw)。然后我将每个网格项的高度设置为 1/2 SW。我以 1/2 屏幕尺寸 ^2 的最大尺寸下载图像。尝试以编程方式使其动态化和缩放对于与远程数据配对的 gridview 来说并不是一个好主意。我还让背景图像视图的宽度大于屏幕尺寸,以防止其间距不一致,网格视图的缩放将其缩小到正确的宽度。

标签: android android-gridview


【解决方案1】:

最好的办法是继承RelativeLayout 并覆盖onMeasure()

public class SquareRelativeLayout extends RelativeLayout{

    public SquareRelativeLayout (Context context) {
        super(context);
    }

    public SquareRelativeLayout (Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public SquareRelativeLayout (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec);
    }

}

这应该适用于GridView,因为它将使用MeasureSpec.EXACTLY,IIRC 的模式。如果它不起作用,您可以使用此处的建议调整代码:Simple way to do dynamic but square layout

顺便说一句,您应该可以通过设置背景然后为位图指定android:scaleType="fitCenter" 来使用单个ImageView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2017-01-31
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多