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);
}