Android实现ListView嵌套GridView实现购物规格选择
Posted LZ涸泽而渔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
//解决宽度不能铺满
试验了一下,并无卵用,原谅我没有去仔细的研究它,我更喜欢去换思路解决而不是怼着一个思路一路怼到黑
,有知道的朋友请不吝赐教
另外,宽度问题我试过动态的去控制内部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); );这样就实现了需求,废话有点多。只是想做个记录,有更好的思路的大佬可留言赐教,不胜感激
以上是关于Android实现ListView嵌套GridView实现购物规格选择的主要内容,如果未能解决你的问题,请参考以下文章
Listview嵌套Viewpager实现仿淘宝搜狐广告主页,并实现listview的下拉刷新
Android中不同方向嵌套滑动的解决方式(ListView为样例)
NestedScrollView嵌套ListView出现问题以及解决方法