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

来源:互联网 发布:网络之暴力法师 编辑:程序博客网 时间:2024/04/29 02:47

前言:


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

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);

//解决宽度不能铺满  

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

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

  另外,宽度问题我试过动态的去控制内部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);            }        }    }});
这样就实现了需求,废话有点多。只是想做个记录,有更好的思路的大佬可留言赐教,不胜感激

原创粉丝点击