其实GridView的用法同listView用法一样,不过它可以较为简单的实现多列列表的展示。主要步骤就是设置数据,构建Adapter,再将Adapter设置给GridView。
GirdView的一些常用属性:
android:numColumns="auto_fit" --------列数设置为自动
android:columnWidth="90dp",----------每列的宽度,也就是Item的宽度
android:stretchMode="columnWidth"------缩放与列宽大小同步
android:verticalSpacing="10dp"----------垂直边距
android:horizontalSpacing="10dp"-------水平边距
下面就给出一个较为简单的实现案例:
<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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.lammy.gridviewdemo.MainActivity"> <GridView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/grid_view" android:verticalSpacing="10dp" android:horizontalSpacing="10dp" android:numColumns="3" /> </RelativeLayout>
主要是指定了GridView的列数,行列之间的间距等属性。
每一个view的布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="150dp" android:layout_height="150dp" android:id="@+id/image" android:scaleType="fitXY" /> <TextView android:layout_width="150dp" android:layout_height="wrap_content" android:layout_below="@+id/image" android:textAlignment="center" android:id="@+id/text" /> </RelativeLayout>
最后是Activity,simpleAdapter的构建的最后2个参数顺序需要一致,否则会出错。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList<Map<String , Object>>list = new ArrayList(); int n=30; for(int i= 0 ; i< n ; i ++) { Map <String , Object>map = new HashMap<String,Object>(); map.put("image" , R.drawable.a7);//为了简单,将所有图弄一样 map.put("number" , "Apple"+i); list.add(map); } String [] dataItem=new String[]{"image","number"}; int []views = {R.id.image , R.id.text}; SimpleAdapter adpter = new SimpleAdapter(this , list ,R.layout.adapter_item ,dataItem , views); GridView gridView = (GridView) findViewById(R.id.grid_view); gridView.setAdapter(adpter); } }
二、宽度无效
之前在网上见到,设置无效,是因为在inflate的时候parent置为空导致的顶层布局没有加载。而下面代码中,若只是新建一个textview,会发现设置宽高也无效,最终通过布局属性设置才生效,证明getview中返回的view必须含有布局属性,否则它的大小设置都无效。
public View getView(int position, View convertView, ViewGroup parent) { //用button 会和gridview抢占监听事件,导致无法监听到gridview 的item点击事件 // Button button = new Button(mContext); TextView textView = new TextView(mContext); // textView.setWidth(50); // textView.setHeight(40); textView.setGravity(Gravity.CENTER); textView.setBackgroundColor(0Xffffff00); textView.setText(functions[position]); //不添加下面中的一个布局,则会发现textView 无论怎么设置宽高都无效 // textView.setLayoutParams(new GridView.LayoutParams(200,160)); textView.setLayoutParams(new RelativeLayout.LayoutParams(200,120)); return textView; }