定义的ListView嵌套GridView的布局

本文介绍如何通过在ListView中嵌套GridView实现特定的布局效果。在处理时,需注意GridView需重写onMeasure方法以避免只显示一行的问题。通过自定义ListView的Item布局,结合数据处理和事件监听(如使用EventBus),可以动态控制标题的显示与隐藏,从而实现标题与内容的分组显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
实现的效果如图所示。
ListView有的时候对于一些效果实现起来不是那么容易,像这种布局用litview实现起来有点困难,但是使用listview嵌套GridView实现起来就简单很多了。
需要注意的是GridView需要重写onMeasure方法:

 @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

否则就会导致gridview只显示一行。
下面就是控制标题栏的显示与隐藏即可下面是ListView的Item的布局:

<TextView
        android:id="@+id/txt_name"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:layout_marginLeft="12dp"
        android:gravity="center_vertical"
        android:text="灯光"
        android:textColor="@color/gray_remin"
        android:textSize="16sp" />

    <com.sds.smarthome.widget.MyGridView
        android:id="@+id/gv_device"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:numColumns="4">

    </com.sds.smarthome.widget.MyGridView>

最后就是对数据做些手脚将同一类型的数据统一设置一个标题,看下具体怎么设置的吧:

 mDatas = new ArrayList<>();
        ZigbeeResponse z1 = new ZigbeeResponse();
        z1.setTitle("灯光");
        mDatas.add(z1);
        ZigbeeResponse z2 = new ZigbeeResponse();
        z2.setType("1");
        z2.setTitle("灯光");
        z2.setName("灯光1");
        mDatas.add(z2);
        ZigbeeResponse z3 = new ZigbeeResponse();
        z3.setType("1");
        z3.setName("灯光2");
        z3.setTitle("灯光");
        mDatas.add(z3);
        ZigbeeResponse z4 = new ZigbeeResponse();
        z4.setType("1");
        z4.setName("灯光3");
        z4.setTitle("灯光");
        mDatas.add(z4);
        .
        .
        .
           addZigbeeAdapter = new AddZigbeeAdapter(mDatas);
        lvZigbee.setAdapter(addZigbeeAdapter);

z1代表的是标题,只设置标题其他为空,在看下Holder中怎么写的

 protected void refreshView() {
        ZigbeeResponse data = getData();
        String title = data.getTitle();
        String name = data.getName();
        if (!StringUtils.isEmpty(name)) {
            txtTitle.setVisibility(View.GONE);
        } else {
            List<ZigbeeResponse> allData = getAllData();
            LogUtil.e("gvDevice" + allData);
            txtTitle.setText(title);
            txtTitle.setVisibility(View.VISIBLE);
            myDatas = new ArrayList<>();
            for (int i = 0; i < allData.size(); i++) {
                if (allData.get(i).getTitle().equals(title)) {
                    if (!StringUtils.isEmpty(allData.get(i).getName()))
                    myDatas.add(allData.get(i));
                }
            }
            LogUtil.e("myDatas size" + myDatas.size());
            adapter = new GvZigbeeAdapter(myDatas);
            gvDevice.setAdapter(adapter);
        }
    }

然后根据内容是否设置来显示标题即可。
点击事件使用的是EventBus,由于是公司的项目源码不好拿出来。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值