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学习之仿QQ側滑功能的实现

Android中不同方向嵌套滑动的解决方式(ListView为样例)

NestedScrollView嵌套ListView出现问题以及解决方法

NestedScrollView嵌套ListView时只显示一行的解决方法

Android中RecyclerView嵌套RecyclerView或嵌套ListView