GridView是一个在二维可滚动的网格中展示内容的控件。网格中的内容通过使用adapter
自动插入到布局中。
下面通过实现一个简单的显示省份名的demo,介绍GridView控件的基本使用方法:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.sunxiaodong.androidgridview.MainActivity">
<GridView
android:id="@+id/grid_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="90dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
</RelativeLayout>
这个GridView会填充满整个屏幕,关于使用属性的说明,在下一节“GridView主要属性详解”中将进行说明。
public class MainActivity extends AppCompatActivity {
private GridView mGridView;
private ProvinceAdapter mProvinceAdapter;
private String[] provinceNames = new String[]{"北京", "上海", "广东", "广西", "天津", "重庆", "湖北", "湖南", "河北", "河南", "山东"};
private int[] bgColor = new int[]{R.color.color_00ff00, R.color.color_ff0000, R.color.color_ff0000, R.color.color_ffff00,
R.color.color_8e35ef, R.color.color_303F9F, R.color.color_00ff00, R.color.color_ff0000, R.color.color_ff0000,
R.color.color_ffff00, R.color.color_8e35ef};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mGridView = (GridView) this.findViewById(R.id.grid_view);
List<ProvinceBean> provinceBeanList = new ArrayList<>();
for (int i = 0; i < provinceNames.length; i++) {
ProvinceBean provinceBean = new ProvinceBean();
provinceBean.setName(provinceNames[i]);
provinceBean.setColor(bgColor[i]);
provinceBeanList.add(provinceBean);
}
mProvinceAdapter = new ProvinceAdapter(this, provinceBeanList);
mGridView.setAdapter(mProvinceAdapter);
}
}
程序中,首先使用findViewById
方法获取到了GridView控件,接下来使用setAdapter
方法给它设置提供数据的适配器。程序中,引入了两份数据provinceNames 和bgColor,其中provinceNames定义了依次显示在GridView各网格中的省份名称,bgColor定义了依次显示在GridView网格中的省份名称的背景色,这些只是为了更方便读者从视觉上认识GridView。
public class ProvinceAdapter extends BaseAdapter {
private List<ProvinceBean> provinceBeanList;
private LayoutInflater layoutInflater;
public ProvinceAdapter(Context context, List<ProvinceBean> provinceBeanList) {
this.provinceBeanList = provinceBeanList;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return provinceBeanList.size();
}
@Override
public Object getItem(int position) {
return provinceBeanList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.province_grid_view_item_layout, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
ProvinceBean provinceBean = provinceBeanList.get(position);
if (provinceBean != null) {
holder.text.setText(provinceBean.getName());
holder.text.setBackgroundResource(provinceBean.getColor());
}
return convertView;
}
class ViewHolder {
TextView text;
}
}
ProvinceAdapter继承自BaseAdapter,有几个必须实现的方法getCount()
,getItem(int position)
,getItemId(int position)
和getView(int position, View convertView, ViewGroup parent)
。其中,getCount()
返回需要展示的GridView的项数。getItem(int position)
返回给定位置的数据对象。getItemId(int position)
返回该项的行id。getView(int position, View convertView, ViewGroup parent)
是必须要实现的方法,该方法控制GridView中数据项的显示,方法中的convertView视图是被复用的视图,在实现时对其进行判断,如果为null,则新建视图,否则直接复用视图。
上面程序的执行效果如下图所示:
android:columnWidth
setColumnWidth(int)
。定义每一列的固定宽度。 android:gravity
setGravity(int)
。定义每一个单元格的重心。 常量
值
描述
top
0x30
将对象放在它的容器的顶部,不会改变它的大小
bottom
0x50
将对象放在它的容器的底部,不会改变它的大小
left
0x03
将对象放在它的容器的左面,不会改变它的大小
right
0x05
将对象放在它的容器的右面,不会改变它的大小
center_vertical
0x10
将对象放在它的容器垂直方向的中心,不会改变它的大小
fill_vertical
0x70
如果需要改变对象的垂直大小以完全填充它的容器
center_horizontal
0x01
将对象放在它的容器水平方向的中心,不会改变它的大小
fill_horizontal
0x07
如果需要改变对象的水平大小以完全填充它的容器
center
0x11
将对象放在它的容器的中心,不会改变它的大小
fill
0x77
如果需要改变对象的水平和垂直方向的大小以完全填充它的容器
clip_vertical
0x80
附加选项被设置用来将子视图的上面或下面边缘裁剪到它的容器的边界。这个裁剪基于垂直方向的重心:top重心将会裁剪底部边缘,bottom重心将会裁剪顶部边缘,不会同时裁剪两边
clip_horizontal
0x08
附加选项被设置用来将子视图的左面或右面边缘裁剪到它的容器的边界。这个裁剪基于水平方向的重心:left重心将会裁剪右面边缘,right重心将会裁剪左面边缘,不会同时裁剪两边
start
0x00800003
将对象放在它的容器的起始位置,不会改变它的大小
end
0x00800005
将对象放在它的容器的末尾位置,不会改变它的大小
android:horizontalSpacing
setHorizontalSpacing(int)
。定义了两列之间的水平间隔。 android:columnWidth
android:numColumns
setNumColumns(int)
。定义了展示的列数。 常量
值
描述
auto_fit
-1
在有效空间展示尽量多的列数
android:stretchMode
setStretchMode(int)
。定义了列拓展填充有限闲置空间的方式。 常量
值
描述
none
0
扩展无效
spacingWidth
1
列与列之间的空间被扩展
columnWidth
2
每一列被相等的拓展
spacingWidthUniform
3
列与列之间的空间被均匀的扩展
android:verticalSpacing
setVerticalSpacing(int)
。定义两行之间的垂直间隔。 android:columnWidth
ListAdapter:getAdapter()
int:getColumnWidth()
int:getGravity()
Gravity.LEFT
。int:getHorizontalSpacing()
setHorizontalSpacing(int)
来设置间隔,但布局还没有完成,这个方法会返回一个旧值。如果想要明确地获取这个间隔,使用getRequestedHorizontalSpacing()
方法请求。int:getNumColumns()
AUTO_FIT
。int:getRequestedColumnWidth()
getColumnWidth()
获取当前真实的列宽度。int:getRequestedHorizontalSpacing()
setHorizontalSpacing(int)
方法设置的值。如果布局尚未完成或GridView计算得到了一个和请求的不同的水平间隔,它与getHorizontalSpacing()
将有不同的返回值。int:getStretchMode()
int:getVerticalSpacing()
onInitializeAccessibilityNodeInfoForItem(View view, int position, AccessibilityNodeInfo info)
AccessibilityNodeInfo
。参数
描述
View
呈现列表项的视图
position
在Adapter中列表项的位置
info
需要初始化的信息项(Node Info)
boolean:onKeyDown(int keyCode, KeyEvent event)
KeyEvent.Callback.onKeyDown()
的默认实现:如果视图可点击,当KEYCODE_DPAD_CENTER
或KEYCODE_ENTER
被释放时,执行视图按下事件。 boolean:onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
KeyEvent.Callback.onKeyMultiple()
的默认实现:一直返回false。 boolean:onKeyUp(int keyCode, KeyEvent event)
KeyEvent.Callback.onKeyUp()
的默认实现:当KEYCODE_DPAD_CENTER
或KEYCODE_ENTER
被释放时,执行视图点击事件。 setAdapter(ListAdapter adapter)
setColumnWidth(int columnWidth)
setGravity(int gravity)
Gravity.LEFT
。setHorizontalSpacing(int horizontalSpacing)
setNumColumns(int numColumns)
setRemoteViewsAdapter(Intent intent)
setSelection(int position)
setStretchMode(int stretchMode)
常量
值
描述
NO_STRETCH
0
扩展无效
STRETCH_COLUMN_WIDTH
2
扩展列
STRETCH_SPACING
1
扩展列间的空间
STRETCH_SPACING_UNIFORM
3
均匀地扩展列间的空间
setVerticalSpacing(int verticalSpacing)
smoothScrollByOffset(int offset)
smoothScrollToPosition(int position)
attachLayoutAnimationParameters(View child, ViewGroup.LayoutParams params, int index, int count)
参数
描述
child
和动画参数关联的子视图
params
持有动画参数的子视图的布局参数
index
子视图在视图组中的索引
count
视图组中子视图的数量
computeVerticalScrollExtent()
computeVerticalScrollRange()
和computeVerticalScrollOffset()
相同的任意单位。 computeVerticalScrollOffset()
computeVerticalScrollRange()
和computeVerticalScrollExtent()
相同的任意单位。 computeVerticalScrollRange()
computeVerticalScrollExtent()
和computeVerticalScrollOffset()
相同的任意单位。 layoutChildren()
onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect)
参数
描述
gainFocus
如果视图具有焦点,值为真;否则为假
direction
当调用requestFocus()为该视图设置焦点时,该值为焦点移动的方向。其值为FOCUS_UP、FOCUS_DOWN、FOCUS_LEFT或者FOCUS_RIGHT
previouslyFocusedRect
失去焦点的视图的矩形坐标,使用该视图的坐标系统.如果指定了,它将传入可以知道焦点来自哪里的详细信息(作为对direction 的补充)。否则,其值为null
onMeasure(int widthMeasureSpec, int heightMeasureSpec)
手机扫一扫
移动阅读更方便
你可能感兴趣的文章