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);
            }
        }
    }
});
这样就实现了需求,废话有点多。只是想做个记录,有更好的思路的大佬可留言赐教,不胜感激

特别说明请注意: 根许多网友反应, using Maticsoft.Functions; 这些代码看不懂 其实Functions 这个dll是我定义常用的函数类,如果需要跟我联系索取http://sql8.net 下面有我的群号, 其中 ArtsShop.Model.Arts_Product _p = new ArtsShop.Model.Arts_Product(); ArtsShop.BLL.Arts_Product p = new ArtsShop.BLL.Arts_Product(); _p = p.GetModel(id); 这是我的商品信息的类,三层结构,这个在用时你们只能换成你们自己的,这些代码完全可以删除, 比如 MyDr[1] = _p.Title; 用来读取商品名的,你们可以改MyDr[1] = dr["productname"].ToString();就行了, AddToCart.aspx页面代码 无标题页 <asp:TextBox ID="TextBox1" runat="server" Text='' Width="44px"> <asp:Label ID="Label1" runat="server" Text=''> 保存 取消 编辑 继续购物 清空购物车 下订单 AddToCart.aspx.cs页面代码 using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using Maticsoft.Functions;public partial class AddToCart : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int ProID; HttpCookie cookie; bool Tempbl = false; string Tempstr; if (!Page.IsPostBack) { if (!object.Equals(Request.QueryString["id"], null)) { ProID = int.Parse(Request.QueryString["id"]); //创购物车cookie yxy .//sql8.net if (object.Equals(Request.Cookies["ztbscart"], null)) cookie = new HttpCookie("ztbscart"); else cookie = Request.Cookies["ztbscart"]; //判断是否已存在于购物车内 yxy // sql8.net for (int i = 0; i < cookie.Values.Keys.Count; i++) { if (!object.Equals(cookie.Values.Keys[i], null)) { Tempstr = cookie.Values.AllKeys[i].ToString(); if (Tempstr.Trim() != "") { if (ProID == int.Parse(cookie.Values.AllKeys[i])) { Tempbl = true; break; } } } } //不未购买过则加入购物车 yxy //sql8.net if (!Tempbl) cookie.Values.Add(ProID.ToString(), "1"); else { } TimeSpan ts = new TimeSpan(0, 0, 10, 0); cookie.Expires = DateTime.Now + ts; Response.AppendCookie(cookie); } BindGrid(); } } //绑定数据 yxy //sql8.net private void BindGrid() { DataTable MyDt; DataRow MyDr; string str = ""; MyDt = new DataTable(); MyDt.Columns.Add(new DataColumn("id", str.GetType())); MyDt.Columns.Add(new DataColumn("Title", str.GetType())); MyDt.Columns.Add(new DataColumn("Num", str.GetType())); MyDt.Columns.Add(new DataColumn("Price", str.GetType())); MyDt.Columns.Add(new DataColumn("Discount", str.GetType())); MyDt.Columns.Add(new DataColumn("Vipprice", str.GetType())); MyDt.Columns.Add(new DataColumn("Totle", str.GetType())); if (!object.Equals(Request.Cookies["ztbscart"], null)) { HttpCookie cookie = Request.Cookies["ztbscart"]; double Totle; //Response.Write("|" + Request.Cookies["ztbscart"].Values.Keys[1].ToString() + "|"); //Response.End(); for (int i = 0; i < cookie.Values.Keys.Count; i++) { int id; MyDr = MyDt.NewRow(); if (cookie.Values.AllKeys[i] != "" && cookie.Values[i] != "") { id = int.Parse(cookie.Values.AllKeys[i].ToString()); ArtsShop.Model.Arts_Product _p = new ArtsShop.Model.Arts_Product(); ArtsShop.BLL.Arts_Product p = new ArtsShop.BLL.Arts_Product(); _p = p.GetModel(id); MyDr[0] = id; MyDr[1] = _p.Title; MyDr[2] = cookie.Values[i]; MyDr[3] = _p.Price; MyDr[4] = _p.Discount; MyDr[5] = _p.Vipprice1; Totle = double.Parse(MyDr[2].ToString()) * double.Parse(MyDr[5].ToString()); MyDr[6] = Totle; MyDt.Rows.Add(MyDr); } } GridView1.DataSource = MyDt.DefaultView; GridView1.DataBind(); } } protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e) { //编辑某行数量 yxy //sql8.net GridView1.EditIndex = e.NewEditIndex; BindGrid(); } protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { //取消更新 yxy //sql8.net GridView1.EditIndex = -1; BindGrid(); } protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) { //更新数量 yxy //sql8.net string num; TextBox tempbx = new TextBox(); Label templb = new Label(); tempbx = (TextBox)(GridView1.Rows[e.RowIndex].Cells[6]).Controls[1]; num = tempbx.Text.ToString(); HttpCookie cookie = new HttpCookie("ztbscart"); for (int i = 0; i < GridView1.Rows.Count; i++) { string id; string tempnum; id = GridView1.Rows[i].Cells[1].Text.ToString(); if (e.RowIndex == i) tempnum = num; else { templb = (Label)(GridView1.Rows[i].Cells[6]).Controls[1]; tempnum = templb.Text.ToString(); } if (tempnum.Trim() == "") tempnum = "0"; //Response.Write("ID:"+id.ToString() + "Num:"+tempnum+":"+i+"");//测试用途 yxy//sql8.net cookie.Values.Add(id, tempnum); } //Response.End(); TimeSpan ts = new TimeSpan(0, 0, 10, 0); cookie.Expires = DateTime.Now + ts; Response.AppendCookie(cookie); GridView1.EditIndex = -1; Message.GoTo("AddToCart.aspx"); } protected void LinkButton4_Click(object sender, EventArgs e) { //继续购物 yxy //sql8.net Message.WebClose(); } protected void LinkButton3_Click(object sender, EventArgs e) { //清空购物车 yxy //sql8.net CheckBox tempcb = new CheckBox(); HttpCookie cookie = new HttpCookie("ztbscart"); Label templb = new Label(); for (int i = 0; i < GridView1.Rows.Count; i++) { tempcb = (CheckBox)(GridView1.Rows[i].Cells[0]).Controls[1]; if (!tempcb.Checked) { string id; string tempnum; id = GridView1.Rows[i].Cells[1].Text.ToString(); templb = (Label)(GridView1.Rows[i].Cells[6]).Controls[1]; tempnum = templb.Text.ToString(); if (tempnum.Trim() == "") tempnum = "0"; //Response.Write("ID:"+id.ToString() + "Num:"+tempnum+":"+i+"");//测试用途 yxy//sql8.net cookie.Values.Add(id, tempnum); } } TimeSpan ts = new TimeSpan(0, 0, 10, 0); cookie.Expires = DateTime.Now + ts; Response.AppendCookie(cookie); Message.GoTo("AddToCart.aspx"); } protected void CheckAll_CheckedChanged(object sender, EventArgs e) { //全选事件 yxy //sql8.net CheckBox tempcb = new CheckBox(); bool tempbl; tempcb = (CheckBox)(GridView1.HeaderRow.Cells[0]).Controls[1]; tempbl = tempcb.Checked; for (int i = 0; i < GridView1.Rows.Count; i++) { tempcb = (CheckBox)(GridView1.Rows[i].Cells[0]).Controls[1]; tempcb.Checked = tempbl; } } } _________________________________________________________________________ 如转载请注明原出处 www.sql8.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值