mvp实现简单购物车

M层

M层接口

package com.example.shoppings.model;


import com.example.shoppings.callback.ICallBock;

public interface IModel {
    public void getModel(ICallBock callBock, String url);

}

M层实现类

package com.example.shoppings.model;

import android.os.Handler;
import android.os.Message;
import android.util.Log;


import com.example.shoppings.beans.MyBean;
import com.example.shoppings.callback.ICallBock;
import com.example.shoppings.utils.OkHttps;
import com.google.gson.Gson;

import java.util.List;

public class Model implements IModel{
    ICallBock iCallBock;

    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

                String json= (String) msg.obj;
                Log.e("Model", "json"+json);
                Gson gson=new Gson();
             MyBean myBean = gson.fromJson(json, MyBean.class);
            List<MyBean.DataBean> list = myBean.getData();
            Log.e("Model", "list:" + list);
                iCallBock.iCallBack(list);



        }
    };
    @Override
    public void getModel(ICallBock callBock ,String url) {
        this.iCallBock=callBock;

        OkHttps.getInstance().doget(handler,url);


    }


}

P层

P层接口

package com.example.shoppings.presenter;

public interface IPresenter {
    public void toModel();

}

P层实现类

package com.example.shoppings.presenter;

import android.util.Log;
import com.example.shoppings.beans.MyBean;
import com.example.shoppings.callback.ICallBock;
import com.example.shoppings.model.IModel;
import com.example.shoppings.model.Model;
import com.example.shoppings.view.IView;

import java.util.List;

public class Presenter  implements IPresenter{

    IModel iModel;
    IView iView;
    public Presenter(IView iView){
    this.iView=iView;
    iModel=new Model();
    }

    @Override
    public void toModel() {
        String url="http://www.wanandroid.com/tools/mockapi/6523/restaurant-list";
    iModel.getModel(new ICallBock() {
        @Override
        public void iCallBack(List<MyBean.DataBean> list) {
            Log.e("Presenter", "showview");
                iView.showView(list);

        }

    },url);
    }




}

V层

V层接口

package com.example.shoppings.view;


import com.example.shoppings.beans.MyBean;

import java.util.List;

public interface IView {
    public void showView(List<MyBean.DataBean> list);

}

MainActivity类

package com.example.shoppings;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.TextView;

import com.example.shoppings.beans.MyBean;
import com.example.shoppings.presenter.IPresenter;
import com.example.shoppings.presenter.Presenter;
import com.example.shoppings.utils.RightAdpler;
import com.example.shoppings.view.IView;

import java.util.List;

public class MainActivity extends AppCompatActivity implements IView {
        IPresenter iPresenter;
    private RecyclerView rectview;
    private TextView jiesuantext;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rectview = (RecyclerView) findViewById(R.id.rectview);
        jiesuantext = (TextView) findViewById(R.id.jiesuantext);


        iPresenter=new Presenter(this);
        iPresenter.toModel();
    }

    @Override
    public void showView(List<MyBean.DataBean> list) {

            Log.e("MainActivity", "list:" + list);



        LinearLayoutManager manager=new LinearLayoutManager(MainActivity.this);
        rectview.setLayoutManager(manager);
        RightAdpler rightAdpler=new RightAdpler(MainActivity.this,list,jiesuantext);

        rectview.setAdapter(rightAdpler);


    }
}

OkHttp

OkHttp封装类

package com.example.shoppings.utils;

import android.os.Handler;
import android.os.Message;
import android.util.Log;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttps {

    static OkHttps https = null;

    private OkHttps() {
    }

    public static OkHttps getInstance() {
        if (https == null) {
            https = new OkHttps();
        } else {
            return https;
        }
        return https;
    }

    public void doget(final Handler handler,String url) {


            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder().url(url).build();
            Call call = okHttpClient.newCall(request);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Message message = new Message();

                    message.obj = response.body().string();
                    handler.sendMessage(message);
                }
            });



    }

    public void dopost(final Handler handler,String url) {


        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("page", "1")
                .add("count", "10")
                .add("keyword", url)
                .build();
        Request request = new Request.Builder().url("http://172.17.8.100/small/commodity/v1/findCommodityByKeyword?").post(body).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Message message = new Message();
                message.what=2;

                message.obj = response.body().string();

                handler.sendMessage(message);
            }
        });
    }


}

父类适配器

父类的适配器

package com.example.shoppings.utils;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.LinearLayout;
import android.widget.TextView;


import com.example.shoppings.R;
import com.example.shoppings.beans.MyBean;

import java.util.List;

public class RightAdpler extends RecyclerView.Adapter<RightAdpler.Handler> {

   Context context;
    List<MyBean.DataBean> list;
    private TextView jiesuantext;

    public RightAdpler(Context context, List<MyBean.DataBean> list, TextView jiesuantext){
        this.context=context;
        this.list=list;
        this.jiesuantext=jiesuantext;
    }
    @NonNull
    @Override
    public RightAdpler.Handler onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.rightlixtview, null);
        Handler handler=new Handler(view);

        return handler;
    }

    @Override
    public void onBindViewHolder(@NonNull RightAdpler.Handler handler, final int i) {

        handler.textView.setText(list.get(i).getName());

        handler.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if(isChecked){
                    list.get(i).setCreated_at(1+"");
                    notifyDataSetChanged();
                }else{
                    list.get(i).setCreated_at(0+"");
                 notifyDataSetChanged();
                }
            }
        });


        LinearLayoutManager manager=new LinearLayoutManager(context);
        handler.rectcview2.setLayoutManager(manager);
        ZiLeiAdpler rightAdpler=new ZiLeiAdpler(list,context,i,jiesuantext);
        handler.rectcview2.setAdapter(rightAdpler);




    }

    @Override
    public int getItemCount() {
        Log.e("Righttt", "list.size():" + list.size());
        return list.size();
    }

    public class Handler extends RecyclerView.ViewHolder {
            public TextView textView;
            public RecyclerView rectcview2;
            public CheckBox checkBox;
        public Handler(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.textview1);
            rectcview2=itemView.findViewById(R.id.rectcview2);

            checkBox=itemView.findViewById(R.id.fucheckbox);

        }
    }



}

子类适配器

子类的适配器

package com.example.shoppings.utils;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.example.shoppings.R;
import com.example.shoppings.beans.MyBean;

import java.util.List;

public class ZiLeiAdpler extends RecyclerView.Adapter<ZiLeiAdpler.Handlr> {

    private Context context;
    List<MyBean.DataBean> list;
    int a;
    private TextView jiesuantex;
    int zongjia;
    public ZiLeiAdpler(List<MyBean.DataBean> list, Context context, int i, TextView jiesuantext) {
        this.list = list;
        this.context = context;
        this.a = i;
        this.jiesuantex = jiesuantext;
    }

    @NonNull
    @Override
    public ZiLeiAdpler.Handlr onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.zileiview, null);
        Handlr handler = new Handlr(view);

        return handler;
    }

    @Override
    public void onBindViewHolder(@NonNull final ZiLeiAdpler.Handlr handlr, int i) {

        handlr.textView3.setText(list.get(a).getSpus().get(i).getName());
        handlr.textView4.setText(list.get(a).getSpus().get(i).getPraise_num() + "");
        Glide.with(context).load(list.get(a).getSpus().get(i).getPic_url()).into(handlr.imageView);
        String at = list.get(a).getCreated_at();
        final int price = list.get(a).getSpus().get(i).getPraise_num();

        handlr.checkBox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int js=0;
                int xx=Integer.parseInt(jiesuantex.getText().toString());
                if(isChecked){
                    js++;
                    int p=Integer.parseInt(handlr.xiaojiage.getText().toString());
                    xx=xx+p;


                }else{
                    js--;
                    int p=Integer.parseInt(handlr.xiaojiage.getText().toString());
                    xx=xx-p;

                }
                jiesuantex.setText(xx+"");



            }
        });



        handlr.buttonjian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int shuliang = Integer.parseInt(handlr.zidinyitext.getText().toString());
                int xiaojiage = Integer.parseInt(handlr.xiaojiage.getText().toString());
                if (shuliang > 0) {
                    shuliang--;
                    handlr.zidinyitext.setText(shuliang + "");
                    handlr.xiaojiage.setText(xiaojiage - price + "");
                    if (handlr.checkBox1.isChecked()){
                        int zongjiatextview = Integer.parseInt(jiesuantex.getText().toString());
                        zongjiatextview=zongjiatextview-price;
                        jiesuantex.setText(zongjiatextview+"");
                    }


                } else {
                    Toast.makeText(context, "不能再减了", Toast.LENGTH_SHORT).show();
                }

            }
        });

        handlr.buttonjia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int shuxliang = Integer.parseInt(handlr.zidinyitext.getText().toString());
                int xiaojiage = Integer.parseInt(handlr.xiaojiage.getText().toString());

                shuxliang++;
                handlr.zidinyitext.setText(shuxliang + "");

                handlr.xiaojiage.setText(xiaojiage + price + "");
                zongjia=zongjia+price;


                if (handlr.checkBox1.isChecked()){
                    int zongjiatextview = Integer.parseInt(jiesuantex.getText().toString());
                    zongjiatextview=zongjiatextview+price;
                    jiesuantex.setText(zongjiatextview+"");
                }
            }
        });




        if (at.equals("1")) {
            handlr.checkBox1.setChecked(true);

        } else {
            handlr.checkBox1.setChecked(false);
        }

    }

    @Override
    public int getItemCount() {
        Log.e("ZiLeiAdpler", "list.size():" + list.size());
        return list.get(a).getSpus().size();
    }

    public class Handlr extends RecyclerView.ViewHolder {
        private TextView textView3, textView4;
        private ImageView imageView;
        private CheckBox checkBox1;
        private Button buttonjian;
        private TextView zidinyitext, xiaojiage;
        private Button buttonjia;


        public Handlr(@NonNull View itemView) {
            super(itemView);

            imageView = itemView.findViewById(R.id.imageview2);
            textView3 = itemView.findViewById(R.id.zileitextview11);
            textView4 = itemView.findViewById(R.id.zileitextview22);
            checkBox1 = itemView.findViewById(R.id.zicheckbox);
            buttonjian = itemView.findViewById(R.id.buttonjian);
            zidinyitext = itemView.findViewById(R.id.zidinyitext);
            buttonjia = itemView.findViewById(R.id.buttonjia);
            xiaojiage = itemView.findViewById(R.id.xiaojiage);

        }
    }
}

自定义view类

自定义布局类

package com.example.shoppings.utils;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.shoppings.R;

public class ZiDingYiView extends LinearLayout {
     Button buttonjian;
     TextView zidinyitext;
     Button buttonjia;



    public ZiDingYiView(Context context) {
        super(context);
    }

    public ZiDingYiView(Context context,  AttributeSet attrs) {

        super(context, attrs);
        View view = LayoutInflater.from(context).inflate(R.layout.myviews, this);


        buttonjian = (Button) view.findViewById(R.id.buttonjian);
        zidinyitext = (TextView) view.findViewById(R.id.zidinyitext);
        buttonjia = (Button) view.findViewById(R.id.buttonjia);


    }

    public ZiDingYiView(Context context,  AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

CallBack返回接口

package com.example.shoppings.callback;




import com.example.shoppings.beans.MyBean;

import java.util.List;

public interface ICallBock {
    public void iCallBack(List<MyBean.DataBean> list);



}

布局文件

MainACtivity布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rectview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="9">

    </android.support.v7.widget.RecyclerView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/jiesuantext"
            android:layout_width="0dp"
            android:text="0"
            android:textSize="20sp"
            android:paddingTop="10dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
        <Button
            android:id="@+id/jiesuanbutton"
            android:layout_width="0dp"
            android:text="结算"
            android:textSize="20sp"
            android:paddingTop="10dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

    </LinearLayout>

</LinearLayout>

父类布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <CheckBox
        android:id="@+id/fucheckbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
    android:id="@+id/textview1"
    android:layout_width="match_parent"
    android:layout_height="40dp" /></LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rectcview2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout>

子类布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="horizontal">
        <CheckBox
            android:id="@+id/zicheckbox"
            android:layout_width="0dp"
            android:layout_height="100dp"
            android:layout_weight="1"/>
        <ImageView
            android:id="@+id/imageview2"
            android:layout_width="100dp"
            android:layout_height="100dp"
            />

        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="2"
            android:orientation="vertical">
            <TextView
                android:id="@+id/zileitextview11"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
            <TextView
                android:id="@+id/zileitextview22"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    <com.example.shoppings.utils.ZiDingYiView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">

    </com.example.shoppings.utils.ZiDingYiView>


        </LinearLayout>
    </LinearLayout>


</android.support.constraint.ConstraintLayout>

自定义view布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/xiaojiage"
            android:text="0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/buttonjian"
            android:text="减"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/zidinyitext"
            android:text="0"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/buttonjia"
            android:text="加"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

依赖文档

依赖

implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.squareup.okhttp3:okhttp:3.7.0'
    implementation 'com.squareup.okio:okio:1.12.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.hjm:BottomTabBar:1.1.1'
    implementation 'com.github.bumptech.glide:glide:4.8.0'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVP(Model-View-Presenter)是一种软件架构模式,它将软件应用程序分为三个基本部分:模型(Model)、视图(View)和表示器(Presenter)。MVP模式的主要目的是实现UI和业务逻辑之间的分离,使得代码更加可维护和可扩展。 下面是一个简单MVP模式实现的Android登录功能: 1. 创建一个LoginActivity类作为View层,它将负责展示登录页面,处理用户的输入和显示登录结果。 ``` public class LoginActivity extends AppCompatActivity implements LoginContract.View { private EditText mUserNameEditText; private EditText mPasswordEditText; private Button mLoginButton; private TextView mResultTextView; private LoginContract.Presenter mPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); mUserNameEditText = findViewById(R.id.user_name_edit_text); mPasswordEditText = findViewById(R.id.password_edit_text); mLoginButton = findViewById(R.id.login_button); mResultTextView = findViewById(R.id.result_text_view); mPresenter = new LoginPresenter(this); mLoginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String userName = mUserNameEditText.getText().toString(); String password = mPasswordEditText.getText().toString(); mPresenter.login(userName, password); } }); } @Override public void showResult(String result) { mResultTextView.setText(result); } } ``` 2. 创建一个LoginPresenter类作为Presenter层,它将负责处理业务逻辑,调用Model层进行数据处理,并将结果返回给View层。 ``` public class LoginPresenter implements LoginContract.Presenter { private LoginContract.View mView; private LoginModel mModel; public LoginPresenter(LoginContract.View view) { mView = view; mModel = new LoginModel(); } @Override public void login(String userName, String password) { boolean result = mModel.checkUser(userName, password); if (result) { mView.showResult("登录成功"); } else { mView.showResult("登录失败"); } } } ``` 3. 创建一个LoginModel类作为Model层,它将负责进行数据处理,例如检查用户名和密码是否匹配。 ``` public class LoginModel { public boolean checkUser(String userName, String password) { // 进行用户名和密码的匹配,这里假设用户名为admin,密码为123456 return userName.equals("admin") && password.equals("123456"); } } ``` 4. 创建一个LoginContract接口,它定义了View层和Presenter层的接口方法。 ``` public interface LoginContract { interface View { void showResult(String result); } interface Presenter { void login(String userName, String password); } } ``` 通过以上步骤,我们就完成了一个简单MVP模式实现的Android登录功能。在这个例子中,View层处理UI展示和用户输入,Presenter层处理业务逻辑,并调用Model层进行数据处理和返回结果,Model层仅处理数据。这种分层架构可以使代码更加清晰、易于维护和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值