Android中GridView通过自定义适配器实现图文视图排列

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述Android中GridView通过自定义适配器实现图文视图排列相关的知识,希望能为你提供帮助。
android中GridView组件用来以网格方式排列视图,与矩阵类似,当屏幕上有很多元素(文字、图片或其他元素)需要显示时,可以使用该组件。下面我们通过代码实现如下图例(为了方便截图,将事件处理(土司)设置到屏幕顶部

Android中GridView通过自定义适配器实现图文视图排列

文章图片

Android中GridView通过自定义适配器实现图文视图排列

文章图片

Layout下gridview.xml布局文件:
 
1 < ?xml version="1.0" encoding="utf-8"?> 2 < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3android:orientation="vertical" android:layout_width="match_parent" 4android:layout_height="match_parent"> 5< GridView 6android:id="@+id/gv" 7android:layout_width="match_parent" 8android:layout_height="match_parent" 9android:numColumns="3" 10android:columnWidth="90dp" 11android:stretchMode="columnWidth" 12android:verticalSpacing="10dp" 13android:horizontalSpacing="10dp"> 14< /GridView> 15 < /LinearLayout>

 
GridView属性设置解析:

anroid:numColumns="3"GridView的列数设置为3
【Android中GridView通过自定义适配器实现图文视图排列】android:columnWidth="90dp",每列的宽度,也就是Item的宽度
android:stretMode="columnWidth" 缩放与列宽大小同步
android:verticalSpacing="10dp" 两行之间的边距
android:horizontalSpacing="10dp" 两列之间的边距
Layout下item_layout.xml布局文件(即为网格内每个单元格的布局):
1 < ?xml version="1.0" encoding="utf-8" ?> 2 < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3android:layout_width="match_parent" 4android:layout_height="match_parent" 5android:gravity="center"(此处设置gravity为center后便不需要在他处重复设置) 6android:orientation="vertical"> 7< ImageView 8android:id="@+id/iv" 9android:layout_width="wrap_content" 10android:layout_height="wrap_content" 11android:scaleType="centerCrop" 12android:src="https://www.songbingjia.com/android/@mipmap/ic_launcher" /> 13< TextView 14android:id="@+id/tv" 15android:layout_width="wrap_content" 16android:layout_height="wrap_content" 17android:text="功能" (测试使用此处文本框内的文本设置可不添加)/> 18 < /LinearLayout>

java代码实现功能(核心为自定义适配器):

1 public class GridViewDemo extends AppCompatActivity { 2private GridView gv; //声明GridView视图 3@Override 4protected void onCreate(@Nullable Bundle savedInstanceState) { 5super.onCreate(savedInstanceState); 6setContentView(R.layout.gridview); 7gv = (GridView) findViewById(R.id.gv); 8gv.setAdapter(new MyAdapter(this)); //通过设置适配器实现网格内布局 9//为每个单元格(item)添加单击事件 10gv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 11@Override 12public void onItemClick(AdapterView< ?> parent, View view, int position, long id) { 13TextView tv = (TextView) view.findViewById(R.id.tv); 14Toast t =Toast.makeText(GridViewDemo.this,tv.getText().toString(),Toast.LENGTH_SHORT); 15t.setGravity(Gravity.TOP,0,0); 16t.show(); 17} 18}); 19} 20//自定义适配器(通过继承BaseAdapter) 21class MyAdapter extends BaseAdapter { 22Context context; //声明适配器中引用的上下文 23//将需要引用的图片和文字分别封装成数组 24int[] images = {R.mipmap.ic_launcher, R.mipmap. 25ic_launcher, R.mipmap.ic_launcher, R.mipmap. 26ic_launcher, R.mipmap.ic_launcher, R.mipmap.ic_launcher,}; 27String[] names = {"功能1", "功能2", "功能3", "功能4", "功能5", "功能6"}; 28//通过构造方法初始化上下文 29public MyAdapter(Context context) { 30this.context = context; 31} 32@Override 33public int getCount() { 34return names.length; //images也可以 35} 36@Override 37public Object getItem(int position) { 38return names[position]; //images也可以 39} 40@Override 41public long getItemId(int position) { 42return position; 43} 44@Override 45public View getView(int position, View convertView, ViewGroup parent) { 46//通过布局填充器LayoutInflater填充网格单元格内的布局 47View v = LayoutInflater.from(context).inflate(R.layout.item_layout, null); 48//使用findViewById分别找到单元格内布局的图片以及文字 49ImageView iv = (ImageView) v.findViewById(R.id.iv); 50TextView tv = (TextView) v.findViewById(R.id.tv); 51//引用数组内元素设置布局内图片以及文字的内容 52iv.setImageResource(images[position]); 53tv.setText(names[position]); 54//返回值一定为单元格整体布局v 55return v; 56} 57} 58 }


至此代码全部完成,为了实现功能本次未对图片以及文本样式做精细化处理,感兴趣的朋友们可以自己试着敲着玩玩。


 

    推荐阅读