购物车的实现

本文介绍了Android应用开发中ListView的交互实现,包括商品数量按钮的加减、点击结算按钮的效果、列表项的点击和长按处理。在实验中,通过线性布局管理控件,处理了列表项复用导致的错位问题,并实现了列表项的选中状态存储。此外,文章还展示了如何使用对话框(Dialog)进行确认购买和长按操作的弹窗,并探讨了布局管理和CheckBox使用时遇到的问题及解决方案。
摘要由CSDN通过智能技术生成

实验过程中的学习:
1、布局:在实验过程中,将每个列表项中的控件通过线性布局LinearLayout进行排列,其中对于checkbox是RadioGroup的子项,所以需要通过RadioGroup控制。将商家名称,商品图片,商品名称,商品价格作为子项,对于商品的加减操作,将有加减+ - 符号作为按钮,表示商品数量的为textview,再对其进行点击监听事件处理。
2、叠加效果:在实验过程中,对于叠加效果的使用,可以在drawable中定义形状,将其作为图片的背景,设置好边间距和边框大小即可
3、小窗口的使用 :设置监听,对dialog中的参数设置
4、对列表项的长按、点击效果、Toast的使用
实验过程:
1、商品数量按钮加减的效果
商品数量可以增加,可以减少,但是数量不得少于1个
在这里插入图片描述
2、结算按钮的效果
当未选中商品时,则点击结算按钮出现,无选中项的样式,选中商品则出现小弹窗,可以知道选中商品的数量,点击取消则出现取消购买的字样,确定则出现购买成功的字样。
在这里插入图片描述3、对于列表项的处理
点击列表项则出现选中字样,表示选中该产品,长按则出现小窗口,表示接下的操作,同时点击确定、取消的按钮出现的结果字样不一样。

在这里插入图片描述
4、弹窗使用格式的不一样
对于Toast中的参数的使用,不同参数的使用对应不用的呈现效果,在实验过程分别出现两个中情况,分别是信息为一行使用massage,两行或者多行则使用builder.setItems(new String[]{“移入收藏夹”,“删除”,“找相似”},null);进行设置。

实验中遇到的问题:

1、布局管理的不正确,对于约束布局的了解不够充分,无法较好的使用,在实验过程中使用较为麻烦的线性布局,造成代码的冗长。
在学习过程中,对于listview列表控件的数据中,对于checkBox的使用,想用通过点击listview列表来实现点击效果,其中使得checkBox能够成功。
遇到的问题:
2、对于点击列表出现错位的现象
原因:对于listview控件中,页面中设置的列表是有限的,出现列表数据出现复用的现象,但是出现复用的话,没有将数据进行存储,刷新。
在listAdapter中,对于checkBox的状态进行存储。
3、无法出现点击的效果无法出现在对应位置
是因为所使用的CheckBox不是我所需要的列表控件中的CheckBox,所以通过点击监听可以得知通过view.findViewById(R.id.checkbox);进行定义即可。
特别注意所属关系,这已经是第二次出现的问题。

代码见下:

主函数代码:

import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    private ListView mListView;
    private MyAdapter myAdapter;
   private int number = 0;
    private List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
    //定义一个列表集合
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // ButterKnife.bind(this);
        initData();

        mListView = (ListView) findViewById(R.id.listview);
        myAdapter = new MyAdapter(list, this);
        mListView.setAdapter(myAdapter);
       //listview的点击事件
    
       mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
           public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
               // checkBox.setChecked(!checkBox.isClickable());
               CheckBox checkBox= view.findViewById(R.id.checkbox);
               boolean s = (boolean) list.get(position).get("checkbox");
               if (s == true) {
                  list.get(position).put("checkbox", false);
                   checkBox.setChecked(false);
                   number--;
               } else {
                  list.get(position).put("checkbox", true);
                   checkBox.setChecked(true);
                   number++;
               }
           }
       });
       //listview长按事件
        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
           @Override
           public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
              dialog2();
               return true;
           }
       });

        //recyclerView.addOnItemTouchListener(new RecyclerItemClickListenerView(this,mRecyclerView,listener));
    //对button结算进行判断,如果选中则item则弹出确认弹窗,没有选中提示”无选中项”
        Button count = findViewById(R.id.count);
        count.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(number==0){
                    Toast.makeText(v.getContext(), "无选中项", Toast.LENGTH_LONG).show();
                }
                else
                    dialog1_1();
            }
        });
    }

    //小弹窗
    private void dialog1_1(){
        //先new出一个监听器,设置好监听
        DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){

            @Override
            public void onClick(DialogInterface dialog, int which) {
                switch(which){
                    case Dialog.BUTTON_POSITIVE:
                        Toast.makeText(MainActivity.this, "购买成功" , Toast.LENGTH_SHORT).show();
                        break;
                    case Dialog.BUTTON_NEGATIVE:
                        Toast.makeText(MainActivity.this, "取消购买", Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };

        //dialog参数设置
        AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到构造器
        builder.setTitle("确定购买吗?"); //设置标题
        builder.setMessage("你已经选中"+ number+"件商品"); //设置内容
        builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
        builder.setPositiveButton("确认",dialogOnclicListener);
        builder.setNegativeButton("取消", dialogOnclicListener);
        builder.create().show();
    }
//长按小弹窗
    private void dialog2(){
    //先new出一个监听器,设置好监听
             DialogInterface.OnClickListener dialogOnclicListener=new DialogInterface.OnClickListener(){

        @Override
        public void onClick(DialogInterface dialog, int which) {
            switch(which){
                case Dialog.BUTTON_POSITIVE:
                    Toast.makeText(MainActivity.this, "操作成功" , Toast.LENGTH_SHORT).show();
                    break;
                case Dialog.BUTTON_NEGATIVE:
                    Toast.makeText(MainActivity.this, "操作取消", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };
    //dialog参数设置
    AlertDialog.Builder builder=new AlertDialog.Builder(this);  //先得到构造器
    builder.setTitle("选项菜单"); //设置标题
    builder.setItems(new String[]{"移入收藏夹","删除","找相似"},null);
    builder.setIcon(R.mipmap.ic_launcher);//设置图标,图片id即可
    builder.setPositiveButton("确认",dialogOnclicListener);
    builder.setNegativeButton("取消", dialogOnclicListener);
    builder.create().show();
}
    private void initData() {
        //1
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.tls);
        map.put("title", "蒙牛特仑苏纯牛奶");
        map.put("price", "¥39.9");
        map.put("stock", "12");
        map.put("checkbox", false);
        list.add(map);
        //2
        map = new HashMap<String, Object>();
        map.put("brand", "三只松鼠");
        map.put("img", R.drawable.bgg);
        map.put("title", "碧根果");
        map.put("price", "¥29.8");
        map.put("stock", "23");
        map.put("checkbox", false);
        list.add(map);
        //3
        map = new HashMap<String, Object>();
        map.put("brand", "伊利");
        map.put("img", R.drawable.smilk);
        map.put("title", "酸奶");
        map.put("price", "¥19.9");
        map.put("stock", "78");
        map.put("checkbox", false);
        list.add(map);
        //4
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.bug);
        map.put("title", "大容量大学生背包");
        map.put("price", "¥49.9");
        map.put("stock", "22");
        map.put("checkbox", false);
        list.add(map);
        //5
        map = new HashMap<String, Object>();
        map.put("brand", "");
        map.put("img", R.drawable.cloth);
        map.put("title", "薄外套");
        map.put("price", "¥119.9");
        map.put("stock", "33");
        map.put("checkbox", false);
        list.add(map);
        //6
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.cloth2);
        map.put("title", "衣服");
        map.put("price", "¥29.9");
        map.put("stock", "12");
        map.put("checkbox", false);
        list.add(map);
        //7
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.cloth3);
        map.put("title", "大学生外套");
        map.put("price", "¥44.9");
        map.put("stock", "24");
        map.put("checkbox", false);
        list.add(map);
        //8
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.ww1);
        map.put("title", "洗衣液");
        map.put("price", "¥59.9");
        map.put("stock", "23");
        map.put("checkbox", false);
        list.add(map);
        //9
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.ww2);
        map.put("title", "洗衣凝珠");
        map.put("price", "¥162.9");
        map.put("stock", "92");
        map.put("checkbox", false);
        list.add(map);
        //10
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.xjj);
        map.put("title", "洗衣液");
        map.put("price", "¥49.9");
        map.put("stock", "24");
        map.put("checkbox", false);
        list.add(map);
        //11
        map = new HashMap<String, Object>();
        map.put("brand", "蓝月亮");
        map.put("img", R.drawable.xyiy2);
        map.put("title", "洗衣液");
        map.put("price", "¥12.9");
        map.put("stock", "22");
        map.put("checkbox", false);
        list.add(map);
        //12
        map = new HashMap<String, Object>();
        map.put("brand", "天猫超市");
        map.put("img", R.drawable.xl);
        map.put("title", "项链");
        map.put("price", "¥111.9");
        map.put("stock", "13");
        map.put("checkbox", false);
        list.add(map);
    }

}

ListView适配器的代码

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;
import java.util.Map;
//自定义的Adapter
public class MyAdapter extends BaseAdapter  {
    private List<Map<String,Object>> datas;
    private Context mContext;
    private int num = 1;
    //构造方法
    public MyAdapter(List<Map<String ,Object>> datas,Context mContext){
        this.datas = datas;
        this.mContext = mContext;
    }
    //重写BaseAdapter中的方法
    public int getCount(){
        //返回数据的总数
        return datas.size();
    }
    public  Object getItem(int position){
        //返回在list中指定位置的数据的内容
        return datas.get(position);
    }
    public long getItemId(int position){
        //返回数据在list中所在的位置
        return position;
    }
    public View getView(int position, View converView, ViewGroup parent){
        ViewHodle holder;
       if(converView == null) {
           //使用自定义的布局文件作为layout
           converView = LayoutInflater.from(mContext).inflate(R.layout.list_item_layout, null);
           //减少findView的次数
           holder = new ViewHodle();
           //初始化布局中的元素
           holder.brand = (TextView) converView.findViewById(R.id.brand);
           holder.mImageView = (ImageView) converView.findViewById(R.id.imageview);
           holder.mTextView1 = (TextView) converView.findViewById(R.id.textview1);
           holder.mTextView2 = (TextView) converView.findViewById(R.id.textview2);
           holder.mTextView3 = (TextView) converView.findViewById(R.id.textview3);
           holder.mCheckBox = (CheckBox)  converView.findViewById(R.id.checkbox);
           TextView textView = converView.findViewById(R.id.number);
           Button decrease = converView.findViewById(R.id.decrease);
           Button add = converView.findViewById(R.id.add);
           numberCount(textView, decrease, add);
           converView.setTag(holder);
       }
       else{
           holder = (ViewHodle)converView.getTag();
       }
       //从传入的数据中提取数据并绑定到指定的view中
        holder.brand.setText(datas.get(position).get("brand").toString());
        holder.mImageView.setImageResource((Integer)datas.get(position).get("img"));
        holder.mTextView1.setText(datas.get(position).get("title").toString());
        holder.mTextView2.setText(datas.get(position).get("price").toString());
        holder.mTextView3.setText(datas.get(position).get("stock").toString());
        holder.mCheckBox.setChecked((Boolean) datas.get(position).get("checkbox"));
        // 判断checkbox的状态


      //  holder.mButton.setText(datas.get(position).get("button").toString());
        return converView;
    }


    class ViewHodle{
        TextView brand;
        ImageView mImageView;
        TextView mTextView1;
        TextView mTextView2;
        TextView mTextView3;
        CheckBox mCheckBox;
    }

    //对于加减的运算
    public void  numberCount(final TextView textView, Button decrease, Button add){
        textView.setText(num + "");
        //减法
        decrease.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (num > 1) {
                    num--;
                    textView.setText(num + "");
                } else {
                    Toast.makeText(v.getContext(), "数量最低为1份", Toast.LENGTH_SHORT).show();
                    textView.setText("1");
                }

            }
        });
        //加法
        add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                num++;
                textView.setText(num + "");
            }
        });
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值