GridView 多行列表展示,item宽度设置无效的原因

  其实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>
View Code

主要是指定了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>
View Code

最后是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);
    }
}
View Code

 二、宽度无效

之前在网上见到,设置无效,是因为在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;
    }
View Code
原文地址:https://www.cnblogs.com/bokeofzp/p/6063829.html