Android实现ListView嵌套GridView实现购物规格选择

前言:


这样的效果,在做商城的时候应该已经很常见了,但是在实现的过程中还是遇到了许许多多的问题,以下给出遇到的问题,与解决思路

1.recyclerview嵌套recyclerview:

这样做出来的问题是,内层的item,数目与宽度不对,有网友说通过渲染器渲染控制可以解决问题,解决方案如下:

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item,null); 解决条

目显示不全  

View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.check_item, parent,false);

//解决宽度不能铺满  

试验了一下,并无卵用,原谅我没有去仔细的研究它,我更喜欢去换思路解决而不是怼着一个思路一路怼到黑

,有知道的朋友请不吝赐教

扫描二维码关注公众号,回复: 3784330 查看本文章

  另外,宽度问题我试过动态的去控制内部item宽高,依然,无卵用。。

  2.recyclerview嵌套gridview:

问题比第一个更多,首先是子条目数量与第一个方案出现了一样的问题,并且gridview的adapter中

getItemView调用次数出现问题,有网友说,这种出现多次调用的问题时,自定义一个GridView,

在其Omeasure方法中放出一个boolean值,发现在onMeasure状态时,

终止getItemView的最后一步,即return convertview,下面附上原文链接:

http://blog.csdn.net/u011889786/article/details/52143268

好吧,完全没有去试这种办法,原因就不说了,觉得可以的朋友可以试一试

  3.recyclerview嵌套标签

至于标签是什么,可以百度搜一搜,有许许多多的开源的资源可以用,但是同样的,用标签的时候,

也出现了宽度调用不正确的问题并且由于别人已经封装好了,自己修改的话需要去看其源码,额,不看,换方法

  4.listview嵌套gridview

首先说明一下,这是我最终的解决方案,遇到的问题如下:

(1)listview的adapter中的getItemView多次调用(通过固定listview高度可以解决,网上说的match_parent

不管用)

(2)gridview的adapter中的getItemView多次调用(可以尝试使用上述2的方式来解决)

(3)gridview条目数量显示不正确(调整gridview的测量模式为

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
        MeasureSpec.AT_MOST);

这些问题出现了,但是界面效果是不需要怎么调整的,那么我的方案是绕开了其多次调用getItemView对我

代码逻辑的影响

对于上面效果的实现为点击效果为checkbox,放置background为selector:

<!-- 标签的背景 label_bg -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 标签选中时的背景 -->
    <item android:state_checked="true">
        <shape>
            <stroke android:width="@dimen/dp1" android:color="#DC1919" />
            <corners android:radius="@dimen/dp8" />
            <solid android:color="#DC1919" />
        </shape>
    </item>
    <!-- 标签的正常背景 -->
    <item android:state_checked="false">
        <shape>
            <stroke android:width="@dimen/dp1" android:color="#f2f2f2" />
            <corners android:radius="@dimen/dp8" />
            <solid android:color="#f2f2f2" />
        </shape>
    </item>
</selector>
字体颜色也为selector:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 标签选中时的文字颜色 -->
    <item android:color="#ffffff" android:state_checked="true" />
    <!-- 标签的正常文字颜色 -->
    <item android:color="#666666"  android:state_checked="false"  />
</selector>
关键来了-------------------------------

需求是实现单选效果,但是因为多次调用getItemView,使得用实体的选中属性来控制选中状态的思路无法执行

(大概意思为,getItemView时,获取对应position的实体的boolean值来控制是否选中,在点击时,只需要将

对应位置的实体boolean的值作相应的修改再notify一下就可以了)。于是想到,通过findviewById获取到的

控件实体,无论被渲染多少次,其地址都是一样的。。于是

List<CheckBox> mCheckBoxes;
final CheckBox checkBox = (CheckBox) convertView.findViewById(R.id.cb_stock);
mCheckBoxes.add(checkBox);

checkBox.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        CheckBox checkBox1 = (CheckBox) view;
        if (!checkBox1.isChecked()){
            //强制选中一个
            checkBox1.setChecked(true);
        }
        for (CheckBox box : mCheckBoxes) {
            if (!box.toString().equals(checkBox1.toString())) {
                box.setChecked(false);
            }else{
                //选中规格
                mOnStokeChangeListener.onStokeChange(checkBox1.getText().toString(),keyposition);
            }
        }
    }
});
这样就实现了需求,废话有点多。只是想做个记录,有更好的思路的大佬可留言赐教,不胜感激

猜你喜欢

转载自blog.csdn.net/LZ511321/article/details/78647889