说一说GridView

GridView也是我们经常使用的控件。GridView的用法与ListView的用法类似。今天,我们来说一说GridView。

一、

从官方文档,我们可以知道,GridView和ListView都是AbsListView的子类。

一般,我们使用时,也是在布局文件中通过<GridView>标签,比如:

            <GridView
                android:id="@+id/gridView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="5dp"
                android:numColumns="2"
                android:horizontalSpacing="1dp"
                android:verticalSpacing="1dp"/>

这里我们主要讲一下GridView的三个XML属性,也是用的比较多的三个XML属性。

android:numColumns  Defines how many columns to show. (定义列数)

android:horizontalSpacing  Defines the default horizontal spacing between columns. (定义列间的默认水平方向上的间距)注:实际间距可能与这个值不一致

android:verticalSpacing  Defines the default vertical spacing between rows.(定义行间的默认垂直方向上的间距)注:实际间距可能与这个值不一致

其他方面的使用与ListView完全一致,也是结合BaseAdapter。

二、动态设置GridView的高度。

很多时候,我们需要解决ScrollView与GridView的冲突。此时我们可以通过动态设置GridView的高度来解决ScrollView与GridView的冲突。直接上代码:

    /**
     * 动态设置GridView的高度
     * @param gridView
     * @param numColumn
     * @param padding
     */
    public static void setGridViewHeight(GridView gridView, int numColumn, int padding) {
        ListAdapter listAdapter = gridView.getAdapter();
        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            if (i % numColumn == 0) {
                View listItem = listAdapter.getView(i, null, gridView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }
        }
        ViewGroup.LayoutParams params = gridView.getLayoutParams();
        if (listAdapter.getCount() % numColumn == 0) {
            params.height = totalHeight + (gridView.getVerticalSpacing() * (listAdapter.getCount() / numColumn - 1)) + padding;
        } else {
            params.height = totalHeight + (gridView.getVerticalSpacing() * (listAdapter.getCount() / numColumn)) + padding;
        }
        gridView.setLayoutParams(params);
    }

三、实现带加号的GridView。

先直接上代码:

public class PatrolCommitMediaResourceAdapter extends BaseAdapter {
    private Context context;
    private List<PatrolCommitMediaResource> list;

    public PatrolCommitMediaResourceAdapter(Context context, List<PatrolCommitMediaResource> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size() + 1;
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {
        final ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.item_patrol_commit_media_resource, null);
            holder = new ViewHolder();
            holder.iv_resource = (ImageView) convertView.findViewById(R.id.iv_resource);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        if (position == list.size()) {
            holder.iv_resource.setImageResource(R.mipmap.add);
            if (position == 9) {
                holder.iv_resource.setVisibility(View.GONE);
            }
        } else {
            holder.iv_resource.setImageBitmap(list.get(position).getBitmap());
        }
        return convertView;
    }

    public class ViewHolder {
        ImageView iv_resource;
    }
}

注:

1、这里我们只是讲解怎么实现带加号的GridView,所以将其他业务方面的代码都剥离出去了。

2、我们这里是最多九张图片。

现在,我们来分析:

第一步:在getCount方法中,return list.size() + 1;

第二步:在getView方法中,做如下处理:

        if (position == list.size()) {
            holder.iv_resource.setImageResource(R.mipmap.add);
            if (position == 9) {
                holder.iv_resource.setVisibility(View.GONE);
            }
        } else {
            holder.iv_resource.setImageBitmap(list.get(position).getBitmap());
        }

至此,就完成了。

那么如何解决这种GridView与ScrollView的冲突呢?

方法如下:

    /**
     * 专门为带+号的GridView动态设置高度
     * @param gridView
     * @param numColumn
     * @param padding
     * @param maxCount
     */
    public static void setGridViewHeight2(GridView gridView, int numColumn, int padding, int maxCount) {
        ListAdapter listAdapter = gridView.getAdapter();
        if (listAdapter == null) {
            return;
        }
        int totalHeight = 0;
        for (int i = 0; i < listAdapter.getCount(); i++) {
            if (i % numColumn == 0) {
                View listItem = listAdapter.getView(i, null, gridView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }
        }
        ViewGroup.LayoutParams params = gridView.getLayoutParams();
        int count = listAdapter.getCount();
        if (count == maxCount) {
            count--;
        }
        if (count % numColumn == 0) {
            params.height = totalHeight + (gridView.getVerticalSpacing() * (count / numColumn - 1)) + padding;
        } else {
            params.height = totalHeight + (gridView.getVerticalSpacing() * (count / numColumn)) + padding;
        }
        gridView.setLayoutParams(params);
    }

猜你喜欢

转载自blog.csdn.net/zdj_Develop/article/details/81328947