热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Android实现购物车整体页面逻辑详解

这篇文章主要为大家详细介绍了Android实现购物车的整体页面逻辑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文为大家讲解了Android实现购物车的整体页面逻辑,供大家参考,具体内容如下

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

  String url = "http://www.zhaoapi.cn/product/getCarts";
  private ExpandableListView el_cart;
  private CheckBox cb_cart_all_select;
  private TextView tv_cart_total_price;
  private Button btn_cart_pay;
  MyAdapter adapter;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initView();
    initData();
  }

  private void initData() {

    HashMap map = new HashMap<>();
    map.put("uid","71");
    OkhtttpUtils.getInstance().doPost(url, map, new OkhtttpUtils.OkCallback() {
      @Override
      public void onFailure(Exception e) {

      }

      @Override
      public void onResponse(String json) {

        CartInfo cartInfo = new Gson().fromJson(json, CartInfo.class);
        if ("0".equals(cartInfo.getCode())){
          List data = cartInfo.getData();
          adapter = new MyAdapter(data);
          el_cart.setAdapter(adapter);

          //展开二级列表
          for(int x=0; x

MyAdapter.java

public class MyAdapter extends BaseExpandableListAdapter{

  private List list;
  public MyAdapter(List data) {
    list=data;
  }

  @Override
  public int getGroupCount() {
    return list==null &#63; 0 : list.size();
  }

  @Override
  public int getChildrenCount(int i) {
    return list.get(i).getList()==null &#63; 0 :list.get(i).getList().size();
  }

  @Override
  public View getGroupView(final int i, boolean b, View view, ViewGroup viewGroup) {

    //先拿到Bean里组的数据,看hiJson
    CartInfo.DataBean dataBean = list.get(i);
    ParentViewHolder parentViewHolder;
    if (view == null) {
      view = View.inflate(viewGroup.getContext(), R.layout.item_cart_parent, null);
      parentViewHolder = new ParentViewHolder(view);
      view.setTag(parentViewHolder);
    } else {
      parentViewHolder = (ParentViewHolder) view.getTag();
    }
    parentViewHolder.seller_name_tv.setText(dataBean.getSellerName());

    boolean currentSellerAllProductSelected = isCurrentSellerAllProductSelected(i);
    parentViewHolder.seller_cb.setChecked(currentSellerAllProductSelected);

    //D.设置点击CheckBox
    parentViewHolder.seller_cb.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (mOnCartListChangeListener !=null){
          mOnCartListChangeListener.onSellerCheckedChange(i);
        }
      }
    });
    return view;
  }


  @Override
  public View getChildView(final int i, final int i1, boolean b, View view, ViewGroup viewGroup) {

    CartInfo.DataBean dataBean = list.get(i);
    List list1 = dataBean.getList();
    CartInfo.DataBean.ListBean listBean = list1.get(i1);
    ChildViewHolder childViewHolder;


    if (view == null) {
      view = View.inflate(viewGroup.getContext(), R.layout.item_cart_child, null);
      childViewHolder = new ChildViewHolder(view);
      view.setTag(childViewHolder);
    } else {
      childViewHolder=(ChildViewHolder)view.getTag();
    }
    //设置商品名字
    childViewHolder.product_title_name_tv.setText(listBean.getTitle());
    //设置商品单价
    childViewHolder.product_price_tv.setText(listBean.getPrice()+"");
    //设置复选框是否选中
    childViewHolder.child_cb.setChecked(listBean.getSelected() == 1);

    //设置组合式自定义控件内部的数量
    childViewHolder.add_remove_view.setNumber(listBean.getNum());

    //D.设置商品CheckBox的点击事件,通过接口回调,暴露给外面
    childViewHolder.child_cb.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        if (mOnCartListChangeListener != null){
          mOnCartListChangeListener.onProductCheckedChange(i,i1);
        }
      }
    });

    //D.设置商品数量的点击事件,通过接口回调,暴露给外面
    childViewHolder.add_remove_view.setOnNumberChangeListener(new AddSubView.OnNumberChangeListener() {
      @Override
      public void onNumberChange(int num) {
        if (mOnCartListChangeListener !=null){
          mOnCartListChangeListener.onProducNumberChange(i,i1,num);
        }
      }
    });
    return view;
  }

  public boolean isCurrentSellerAllProductSelected(int i){//根据商品改变商家--如果商品全部选中商家则选中--有一个商品没选中则商家不选中
    CartInfo.DataBean dataBean = list.get(i);
    List beans = dataBean.getList();
    for (CartInfo.DataBean.ListBean bean : beans){

      if (bean.getSelected()==0){
        return false;
      }

    }
        return true;
  }

  public boolean isAllProductsSelected(){ //根据商品改变全选--如果商品全部选中全选则选中--有一个商品没选中则全选不选中
    for (int x=0;x list1 = dataBean.getList();
      for (int j=0;j list1 = dataBean.getList();
      for (int j=0;j list = dataBean.getList();
      for (int j=0;j beans = dataBean.getList();
    for (int j=0;j list = dataBean.getList();
    CartInfo.DataBean.ListBean listBean = list.get(i1);
    listBean.setSelected(listBean.getSelected() == 0 &#63; 1 : 0 );

  }
  //C.设置所有商品的状态
  public void changeAllProductStatus(boolean selected){
    for(int x=0; x list = dataBean.getList();
      for(int j=0; j list = dataBean.getList();
    CartInfo.DataBean.ListBean listBean = list.get(i1);
    listBean.setNum(number);
  }

  public interface onCartListChangeListener{
    /**
     * 当商家的checkBox点击时回调
     */
    void onSellerCheckedChange(int i);

    /**
     * 当点击子条目商品的CheckBox回调
     */
    void onProductCheckedChange(int i ,int i1);

    /**
     * 当点击加减按钮的回调
     */
    void onProducNumberChange(int i , int i1 , int number);

  }
  //D.
  onCartListChangeListener mOnCartListChangeListener;
  //D.
  public void setOnCartListChangeListener(onCartListChangeListener onCartListChangeListener){
    mOnCartListChangeListener= onCartListChangeListener ;
  }

  public static class ParentViewHolder {
    public CheckBox seller_cb;
    public TextView seller_name_tv;

    public ParentViewHolder(View rootView) {
      this.seller_cb = (CheckBox) rootView.findViewById(R.id.seller_cb);
      this.seller_name_tv = (TextView) rootView.findViewById(R.id.seller_name_tv);
    }
  }

  public static class ChildViewHolder {
    public CheckBox child_cb;
    public ImageView product_icon_iv;
    public TextView product_title_name_tv;
    public TextView product_price_tv;
    public AddSubView add_remove_view;

    public ChildViewHolder(View rootView) {
      this.child_cb = (CheckBox) rootView.findViewById(R.id.child_cb);
      this.product_icon_iv = (ImageView) rootView.findViewById(R.id.product_icon_iv);
      this.product_title_name_tv = (TextView) rootView.findViewById(R.id.product_title_name_tv);
      this.product_price_tv = (TextView) rootView.findViewById(R.id.product_price_tv);
      this.add_remove_view = (AddSubView) rootView.findViewById(R.id.add_remove_view);
    }
  }

  @Override
  public Object getGroup(int i) {
    return null;
  }

  @Override
  public Object getChild(int i, int i1) {
    return null;
  }

  @Override
  public long getGroupId(int i) {
    return 0;
  }

  @Override
  public long getChildId(int i, int i1) {
    return 0;
  }

  @Override
  public boolean hasStableIds() {
    return false;
  }


  @Override
  public boolean isChildSelectable(int i, int i1) {
    return false;
  }
}

activity_main.xml



  

  

    

    

    

    

AddSubView.java

public class AddSubView extends LinearLayout implements View.OnClickListener{  //组合式控件
  private int number = 1;
  private TextView sub_tv;
  private TextView product_number_tv;
  private TextView add_tv;

  public AddSubView(Context context) {
    this(context,null);
  }

  public AddSubView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs,0);
  }

  public AddSubView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);

    View view = inflate(context, R.layout.add_remove, this);

    sub_tv=view.findViewById(R.id.sub_tv);
    product_number_tv=view.findViewById(R.id.product_number_tv);
    add_tv=view.findViewById(R.id.add_tv);


    sub_tv.setOnClickListener(this);
    add_tv.setOnClickListener(this);
  }

  @Override
  public void onClick(View view) {
    switch (view.getId()){

      case R.id.sub_tv:

        if (number>1){
          --number;
          product_number_tv.setText(number+"");
          if (onNumberChangeListener!=null){
            onNumberChangeListener.onNumberChange(number);
          }
        }else {
          Toast.makeText(getContext(), "不能再少了", Toast.LENGTH_SHORT).show();
        }
        break;

      case R.id.add_tv:

        if (number<8){
          ++number;
          product_number_tv.setText(number+"");
          if (onNumberChangeListener!=null){
            onNumberChangeListener.onNumberChange(number);
          }
        }else {
          Toast.makeText(getContext(), "不能再多了", Toast.LENGTH_SHORT).show();
        }
        break;
    }
  }

  public int getNumber() {
    return number;
  }

  public void setNumber(int number) {
    this.number = number;
    product_number_tv.setText(number + "");
  }

  OnNumberChangeListener onNumberChangeListener;

  public void setOnNumberChangeListener(OnNumberChangeListener onNumberChangeListener) {
    this.OnNumberChangeListener= onNumberChangeListener;
  }

  interface OnNumberChangeListener {
    void onNumberChange(int num);
  }
}

add_remove.xml



  

  

  

item_cart_parent.xml




  

  

item_cart_child.xml



  

  

  

    

    
  

  

OkHttpUtils.java

public class OkhtttpUtils {
  private static OkhtttpUtils mOkhtttpUtils;
  private OkHttpClient mOkHttpClien;
  private final Handler mHandler;

  private OkhtttpUtils() {

    //创建一个主线程的handler
    mHandler = new Handler(Looper.getMainLooper());
    mOkHttpClien = new OkHttpClient.Builder()
        .connectTimeout(5000, TimeUnit.MILLISECONDS)
        .readTimeout(5000, TimeUnit.MILLISECONDS)
        .writeTimeout(5000, TimeUnit.MILLISECONDS)
        .build();
  }

  //单例模式
  public static OkhtttpUtils getInstance() {
    if (mOkhtttpUtils == null) {
      synchronized (OkhtttpUtils.class) {
        if (mOkhtttpUtils == null) {
          return mOkhtttpUtils = new OkhtttpUtils();
        }
      }
    }
    return mOkhtttpUtils;
  }

  public interface OkCallback {
    void onFailure(Exception e);
    void onResponse(String json);
  }


  public void doPost(String url, Map map, final OkCallback okCallback) {
    //创建FormBody的对象,把表单添加到formBody中
    FormBody.Builder builder = new FormBody.Builder();
    if (map != null) {
      for (String key : map.keySet()) {
        builder.add(key, map.get(key));
      }
    }
    FormBody formBody = builder.build();

    //创建Request对象
    Request request = new Request.Builder()
        .post(formBody)
        .url(url)
        .build();
    //创建Call对象
    final Call call = mOkHttpClien.newCall(request);
    call.enqueue(new Callback() {
      @Override
      public void onFailure(Call call, final IOException e) {
        if (okCallback != null) {
          //切换到主线程
          mHandler.post(new Runnable() {
            @Override
            public void run() {
              okCallback.onFailure(e);
            }
          });
        }
      }
      @Override
      public void onResponse(Call call, final Response response) throws IOException {
        try {
          if (response != null && response.isSuccessful()) {
            final String json = response.body().string();
            mHandler.post(new Runnable() {
              @Override
              public void run() {
                if (okCallback != null) {
                  okCallback.onResponse(json);
                  return;
                }
              }
            });
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
        if (okCallback != null) {
          okCallback.onFailure(new Exception("网络异常"));
        }
      }
    });
  }




  //封装doGet的网络请求
  public void doGet(String url, final OkCallback okCallback) {
    Request request = new Request.Builder()
        .get()
        .url(url)
        .build();

    final Call call = mOkHttpClien.newCall(request);
    call.enqueue(new Callback() {
      @Override
      public void onFailure(Call call, final IOException e) {
        if (okCallback != null) {
          //切换到主线程
          mHandler.post(new Runnable() {
            @Override
            public void run() {
              okCallback.onFailure(e);
            }
          });
        }
      }

      @Override
      public void onResponse(Call call, final Response response) throws IOException {

        try {
          if (response != null && response.isSuccessful()) {
            final String json = response.body().string();
            mHandler.post(new Runnable() {
              @Override
              public void run() {
                if (okCallback != null) {
                  okCallback.onResponse(json);
                  return;
                }

              }
            });
          }
        } catch (IOException e) {
          e.printStackTrace();
        }

      }
    });
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 可转债数据智能抓取与分析平台优化
    本项目旨在优化可转债数据的智能抓取与分析平台。通过爬取集思录上的可转债信息(排除已发布赎回的债券),并结合安道全教授提出的三条安全线投资策略,新增了建仓线、加仓线和重仓线,以提供更精准的投资建议。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 在Spring框架中,基于Schema的异常通知与环绕通知的实现方法具有重要的实践价值。首先,对于异常通知,需要创建一个实现ThrowsAdvice接口的通知类。尽管ThrowsAdvice接口本身不包含任何方法,但开发者需自定义方法来处理异常情况。此外,环绕通知则通过实现MethodInterceptor接口来实现,允许在方法调用前后执行特定逻辑,从而增强功能或进行必要的控制。这两种通知机制的结合使用,能够有效提升应用程序的健壮性和灵活性。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
  • 深入解析 Android Drawable:第六阶段进阶指南 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • IDEA中高效利用代码变量名替换功能提升编程效率
    在使用 IntelliJ IDEA 进行公司项目代码审查时,我发现许多变量的命名不符合驼峰式命名规范。起初,我尝试手动逐个修改这些变量名,但效率低下。后来,我偶然发现了 IDEA 中的代码变量名替换功能,这极大地提高了我的工作效率。通过该功能,我可以快速批量地将不规范的变量名修改为符合命名规则的形式,不仅节省了时间,还减少了出错的可能性。此外,我还利用这一功能对整个项目的代码进行了全面的优化,确保所有变量命名一致且易于理解。 ... [详细]
  • 如何迅速识别并解决Gradle项目中的Jar包名称冲突问题?
    在处理Gradle项目时,经常会遇到Jar包名称冲突的问题。本文介绍了如何快速识别并解决此类冲突,特别是在使用fastjson的Feature.OrderedField功能时。通过添加特定参数,可以有效避免JSON字段乱序的情况,确保数据的一致性和可靠性。此外,文章还提供了详细的步骤和示例代码,帮助开发者高效地解决Jar包冲突问题。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
author-avatar
情歌怎厸唱狂想曲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有