购物车(下)

本文详细介绍了在MVP模式下设计一个购物应用的过程,包括ShoppingModel、ShoppingView、ShoppingPresenter的实现,以及自定义Adapter和数字加减控件的具体代码。通过此设计,可以有效地分离关注点,提高代码的可维护性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上文
MVP
第二个页面的mvp
ShoppingModel

public class ShoppingModel {
    public void shop(String url, final OKHttpTwo.HttpCallBack httpCallBack){
        OKHttpTwo okHttpTwo = new OKHttpTwo();
        okHttpTwo.shop(url, new OKHttpTwo.HttpCallBack() {
            @Override
            public void setData(String s) {
                Gson gson = new Gson();
                Phone phone = gson.fromJson(s, Phone.class);
                List<Phone.DataBean> data = phone.getData();
                httpCallBack.getData(data);
            }

            @Override
            public void getData(List<Phone.DataBean> list) {

            }
        });
    }
}

ShoppingView

public interface ShoppingView {
    void onData(List<Phone.DataBean> list);
}

ShoppingPersenter

public class ShoppingPersenter {
    private ShoppingView shoppingView;
    private ShoppingModel shoppingModel;

    public ShoppingPersenter(ShoppingView shoppingView) {
        this.shoppingView = shoppingView;
        shoppingModel = new ShoppingModel();
    }

    public void shop(String url){
        shoppingModel.shop(url, new OKHttpTwo.HttpCallBack() {
            @Override
            public void setData(String s) {

            }

            @Override
            public void getData(List<Phone.DataBean> list) {
                shoppingView.onData(list);
            }
        });
    }
}

Adapter
第二个页面的Adapter

public class MyExpandAdapter extends BaseExpandableListAdapter{

    private Context context;
    private List<Phone.DataBean> list;
    private AddSub.OnNumChangedListener mOnNumChangedListener;

    public void setmOnNumChangedListener(AddSub.OnNumChangedListener mOnNumChangedListener) {
        this.mOnNumChangedListener = mOnNumChangedListener;
    }

    public MyExpandAdapter(Context context, List<Phone.DataBean> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getGroupCount() {
        return list.size();
    }

    @Override
    public int getChildrenCount(int i) {
        return list.get(i).getList().size();
    }

    @Override
    public Object getGroup(int i) {
        return list.get(i);
    }

    @Override
    public Object getChild(int i, int i1) {
        return list.get(i).getList().get(i1);
    }

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

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

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

    @Override
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
        GroupViewHolder groupViewHolder = null;
        if(view==null){
            view = View.inflate(context,R.layout.item_first,null);
            groupViewHolder = new GroupViewHolder();
            groupViewHolder.group_box = view.findViewById(R.id.group_box);
            groupViewHolder.group_text = view.findViewById(R.id.group_text);
            view.setTag(groupViewHolder);
        }else{
            groupViewHolder = (GroupViewHolder) view.getTag();
        }
        groupViewHolder.group_text.setText(list.get(i).getSellerName());
        groupViewHolder.group_box.setChecked(list.get(i).isChecked());

        return view;
    }

    @Override
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
        ChildViewHolder childViewHolder = null;
        if(view == null){
            view = View.inflate(context,R.layout.item_two,null);
            childViewHolder = new ChildViewHolder();
            childViewHolder.child_box = view.findViewById(R.id.child_box);
            childViewHolder.child_text = view.findViewById(R.id.child_text);
            childViewHolder.child_image = view.findViewById(R.id.child_image);
            childViewHolder.child_text1 = view.findViewById(R.id.child_text1);
            childViewHolder.mAddSub = view.findViewById(R.id.child_addsub);
            view.setTag(childViewHolder);
        }else{
            childViewHolder = (ChildViewHolder) view.getTag();
        }
        final Phone.DataBean.ListBean listBean = list.get(i).getList().get(i1);
        childViewHolder.child_text.setText(listBean.getTitle());
        //(图片)字符串截取
        String images = list.get(i1).getList().get(0).getImages();
        String[] split = images.split("!");
        Picasso.with(context).load(split[0]).into(childViewHolder.child_image);
        childViewHolder.child_text1.setText(listBean.getPrice());
        childViewHolder.child_box.setChecked(listBean.isChecked());
        childViewHolder.mAddSub.setOnNumChangedListener(new AddSub.OnNumChangedListener() {
            @Override
            public void onNumChange(View view, int curNum) {
                listBean.setNum(curNum);
                if(mOnNumChangedListener!=null){
                    mOnNumChangedListener.onNumChange(view,curNum);
                }
            }
        });
        return view;
    }

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

    class GroupViewHolder{
        CheckBox group_box;
        TextView group_text;
    }

    class ChildViewHolder{
        CheckBox child_box;
        ImageView child_image;
        TextView child_text;
        TextView child_text1;
        AddSub mAddSub;
    }
}

适配器的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal">

    <CheckBox
        android:id="@+id/group_box"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/group_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="商家"
        android:textSize="20dp" />

</LinearLayout>

自定义数字加减的控件
Addsub

public class AddSub extends LinearLayout {
    private List<Phone.DataBean> list = new ArrayList<>();
    private View mView;
    private TextView add,num,sub;
    private OnNumChangedListener onNumChangedListener;

    public void setOnNumChangedListener(OnNumChangedListener onNumChangedListener) {
        this.onNumChangedListener = onNumChangedListener;
    }


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

    public AddSub(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,-1);
    }

    public AddSub(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
        initListener();
        getCount();
    }


    private void initListener() {
        add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                jia();
            }
        });
        sub.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                jian();
            }
        });
    }

    private void jian() {
        String string = num.getText().toString();
        int i = Integer.parseInt(string);
       if(i>1){
            i--;
            setCurrentcount(i);
       }else {
           Toast.makeText(getContext(),"不能再少了。。。",Toast.LENGTH_LONG).show();
       }
    }

    private void jia() {
        String string = num.getText().toString();
        int i = Integer.parseInt(string);
        i++;
        setCurrentcount(i);
    }

    private void initView(Context context) {
        mView = View.inflate(context, R.layout.num, this);
        add = mView.findViewById(R.id.addtext);
        num = mView.findViewById(R.id.numtext);
        sub = mView.findViewById(R.id.subtext);



        num.setText("1");
    }

    public int getCount() {
        return Integer.parseInt(num.getText().toString());
    }

    public void setCurrentcount(int currentcount) {
        num.setText(currentcount+"");
        if(onNumChangedListener != null){
            onNumChangedListener.onNumChange(this,currentcount);
        }
    }

    public interface OnNumChangedListener{
        void onNumChange(View view,int curNum);
    }
}

在自定义控件的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/subtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="-"
        android:textColor="#000" />

    <TextView
        android:id="@+id/numtext"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="10dp"
        android:text="TextView"
        android:textColor="#000" />

    <TextView
        android:id="@+id/addtext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="+"
        android:textColor="#000" />

</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值