电商项目实战------购物车okhttp++mvp-------lll


请求网络的权限

<uses-permission android:name="android.permission.INTERNET"/>

依赖

compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.github.bumptech.glide:glide:3.7.0'

布局

activity_main

<?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="com.example.slx.slx_329.view.MainActivity"
    android:orientation="vertical">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <CheckBox
            android:id="@+id/cb"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="全选"
            />

        <TextView
            android:id="@+id/price"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="总价:"/>

        <TextView
            android:id="@+id/tv_totalPrice"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="0"/>

        <Button
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:text="结算"/>

    </LinearLayout>


</LinearLayout>

 itemlayout

<?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="horizontal">
    <CheckBox
        android:layout_gravity="center"
        android:id="@+id/lv_checkbox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <ImageView
        android:id="@+id/lv_img"
        android:layout_gravity="center"
        android:layout_width="100dp"
        android:layout_height="100dp" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_gravity="center"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/lv_title"
            android:text="标题"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView

                android:id="@+id/lv_price"
                android:text="价格:0.0"
                android:layout_width="120dp"
                android:layout_height="wrap_content" />
            <Button
                android:id="@+id/lv_jian"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="-"/>
            <TextView
                android:id="@+id/lv_num"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="0"/>
            <Button
                android:id="@+id/lv_jia"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:text="+"/>
        </LinearLayout>


    </LinearLayout>
    <Button
        android:id="@+id/lv_remove"
        android:layout_gravity="center"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:text="删除"/>
</LinearLayout>

utils

package com.example.slx.dome.utils;

import android.os.Environment;

import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

import static android.R.string.ok;
import static android.os.Build.VERSION_CODES.M;

/**
 * Created by Administrator on 2018/3/8.
 */

public class OkhtttpUtils {
    //单例模式,把构造方法进行私有化
    //
    private OkhtttpUtils(){};
    static  OkHttpClient client;


    public static OkHttpClient getInstance(){


        if (client==null) {
            //更加安全
            synchronized (OkhtttpUtils.class) {
                //缓存的地方     mnt/sdcard
                File file = new File(Environment.getExternalStorageDirectory(), "cache11");
                client = new OkHttpClient().newBuilder()
                        .readTimeout(3000, TimeUnit.SECONDS)   //设置读取超时时间
                        .connectTimeout(3000, TimeUnit.SECONDS) //设置连接的超时时间

                        .cache(new Cache(file, 10 * 1024))
                        .build();
            }
        }
        return client;
    }


    /**
     * get请求
     * Callback  是一个接口
     */
    public static void doGet(String url, Callback callback){

        //1:拿到okhttpclient  对像

        OkHttpClient client = getInstance();
        //2:进行请求的操作

        Request request = new Request.Builder()
                .url(url)
                .build();
        client.newCall(request).enqueue(callback);


    }

    //post请求

    /**
     *
     * @param url  请求的地址
     * @param parms   请求的参数
     * @param callback  callback
     */
    public static void doPost(String url, Map<String,String> parms,Callback callback){

        //得到客户端的对像
        OkHttpClient client = getInstance();

        //不是FormBody,而是一个Builder
        FormBody.Builder body = new FormBody.Builder();
        //key   value
        for (String key:parms.keySet()){
            //value的值
            body.add(key,parms.get(key));
        }
        Request request = new Request.Builder()
                .url(url)
                .post(body.build())
                .build();

        client.newCall(request).enqueue(callback);

    }

    //用来上传图片的

    //url  , 图片  ,参数    Callback
    public static  void upImage(String url,File file,String filenName,Map<String,String> params,Callback callback){

        OkHttpClient client = getInstance();


        //requestBody的实现类  Formbody
        MultipartBody.Builder builder = new MultipartBody.Builder();

        if (params!=null){
            for (String key :params.keySet()){
                builder.addFormDataPart(key,params.get(key));
            }
        }

        //设置类型
        builder.setType(MultipartBody.FORM);


        builder.addFormDataPart("file",filenName,RequestBody.create(MediaType.parse("application/octet-stream"),file));

      // builder.setType(MultipartBody.FORM);
     // builder.addFormDataPart("file",filenName,RequestBody.create(MediaType.parse("application/octet-stream"),file));
        //builder.addFormDataPart("file","aa.png",builder.build());

        Request request = new Request.Builder()
                .url(url)
                .post(builder.build())
                .build();

        client.newCall(request).enqueue(callback);


    }


} 

view层

public interface IView {
     void toBackHome(List<ShopData.DataBean> list);

}
package com.example.slx.dome.view;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.TextView;

import com.example.slx.dome.R;

import com.example.slx.dome.adapter.MyAdapter;
import com.example.slx.dome.model.bean.ShopData;
import com.example.slx.dome.persenter.MyPersenter;

import java.util.List;

public class MainActivity extends AppCompatActivity implements IView,MyAdapter.Change{

    private ListView listView;
    private TextView price;
    private CheckBox checkBox;
    private MyAdapter adapter;
    String dataUrl ="https://www.zhaoapi.cn/product/getProducts?pscid=1";
    private List<ShopData.DataBean>  list;
    @SuppressLint("HandlerLeak")
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            list=(List<ShopData.DataBean>)msg.obj;
            //给定义的flag赋值
            for (int i = 0; i <list.size() ; i++) {
                list.get(i).setFlag(false);
            }



            //4.1实例化一个接口对象
            adapter = new MyAdapter(MainActivity.this,list);
            listView.setAdapter(adapter);
            //4.2传到对象内部
            adapter.getChange(MainActivity.this);
            getMoney();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.lv);
        price = findViewById(R.id.price);
        checkBox = findViewById(R.id.cb);
        checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                for (int i = 0; i <list.size() ; i++) {
                    list.get(i).setFlag(b);
                }
                adapter.notifyDataSetChanged();
                getMoney();
            }
        });

        MyPersenter myPersenter = new MyPersenter(this);
        myPersenter.newWork(dataUrl);
    }

    @Override
    public void toBackHome(List<ShopData.DataBean> list) {
        Message message = Message.obtain();
        message.obj=list;
        handler.sendMessage(message);
    }

    @Override
    public void changeMoney() {
        getMoney();
    }
    public void jiaNum(){
        getMoney();
    }
    public void jianNum(){
        getMoney();
    }
    public void delete(){
        getMoney();
    }
     //得到总价的方法
    private void getMoney() {
        double zon=0;
        for (int i = 0; i <list.size() ; i++) {
            ShopData.DataBean dataBean = list.get(i);
            boolean flag = dataBean.isFlag();
            if (flag){
                double price = dataBean.getPrice();
                int sellerid = dataBean.getSellerid();
                zon+=price*sellerid;
            }
        }
        price.setText("总价:"+zon);
    }
}

persenter层

public interface Ipersenter {
    void success(List<ShopData.DataBean> list);
    void error();

    void newWork(String dataUrl);
}
package com.example.slx.dome.persenter;

import com.example.slx.dome.model.MyModel;
import com.example.slx.dome.model.bean.ShopData;
import com.example.slx.dome.view.IView;

import java.util.List;

/**
 * Created by lenovo on 2018/4/1.
 */

public class MyPersenter implements Ipersenter{

    private final MyModel myModel;
    private IView iView;
    public MyPersenter(IView iView){
        this.iView=iView;
        myModel = new MyModel();
    }
    @Override
    public void success(List<ShopData.DataBean> list) {
        iView.toBackHome(list);
    }

    @Override
    public void error() {

    }

    @Override
    public void newWork(String dataUrl) {
        myModel.getData(dataUrl,this);
    }
}

model层

public interface Imodel {
    void getData(String dataUrl, Ipersenter ipersenter);
}
package com.example.slx.dome.model;

import com.example.slx.dome.model.bean.ShopData;
import com.example.slx.dome.persenter.Ipersenter;
import com.example.slx.dome.utils.OkhtttpUtils;
import com.google.gson.Gson;

import java.io.IOException;
import java.util.List;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

/**
 * Created by lenovo on 2018/4/1.
 */

public class MyModel implements Imodel{
    @Override
    public void getData(String dataUrl, final Ipersenter ipersenter) {
        OkhtttpUtils.doGet(dataUrl, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String json = response.body().string();
                Gson gson = new Gson();
                ShopData shopData = gson.fromJson(json, ShopData.class);
                List<ShopData.DataBean> list = shopData.getData();
                ipersenter.success(list);
            }
        });
    }
}

adapter

package com.example.slx.dome.adapter;

import android.content.Context;
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 com.bumptech.glide.Glide;
import com.example.slx.dome.R;
import com.example.slx.dome.model.bean.ShopData;

import java.util.List;

/**
 * Created by lenovo on 2018/4/1.
 */

public class MyAdapter extends BaseAdapter{
    //2.提供一个接口对象
    private Change change;

    public String imgUrl = "https://m.360buyimg.com/n0/jfs/t7504/338/63721388/491286/f5957f53/598e95f1N7f2adb87.jpg";
    private Context context;
    private List<ShopData.DataBean> list;

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

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

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

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

    @Override
    public View getView(final int i, View convertView, ViewGroup viewGroup) {
        final ViewHolder holder;
        if(convertView==null){
            convertView = View.inflate(context, R.layout.itemlayout, null);
            holder=new ViewHolder();
            holder.lv_checkbox = convertView.findViewById(R.id.lv_checkbox);
            holder.lv_img = convertView.findViewById(R.id.lv_img);
            holder.lv_title = convertView.findViewById(R.id.lv_title);
            holder.lv_jia = convertView.findViewById(R.id.lv_jia);
            holder.lv_jian = convertView.findViewById(R.id.lv_jian);
            holder.lv_remove = convertView.findViewById(R.id.lv_remove);
            holder.lv_num = convertView.findViewById(R.id.lv_num);
            holder.lv_price = convertView.findViewById(R.id.lv_price);
            convertView.setTag(holder);
        }else {
            holder=(ViewHolder)convertView.getTag();
        }
        holder.lv_title.setText(list.get(i).getTitle());
        Glide.with(context).load(imgUrl).into(holder.lv_img);
        holder.lv_price.setText("价格:"+list.get(i).getPrice());
        holder.lv_num.setText(list.get(i).getSellerid()+"");
        holder.lv_checkbox.setChecked(list.get(i).isFlag());
        //给checkbox一个点击事件,让他显示商品的价格
        holder.lv_checkbox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.get(i).setFlag(!list.get(i).isFlag());
                //添加一个触发事件
                change.changeMoney();
            }
        });
        //
        holder.lv_jia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int sellerid = list.get(i).getSellerid();
                sellerid++;
                list.get(i).setSellerid(sellerid);
                notifyDataSetChanged();
                change.jiaNum();
            }
        });
        holder.lv_jian.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int sellerid = list.get(i).getSellerid();
                if (sellerid==1){
                    holder.lv_jian.setFocusable(false);
                }else {

                    sellerid--;
                }
                list.get(i).setSellerid(sellerid);
                notifyDataSetChanged();
                change.jianNum();
            }
        });
        holder.lv_remove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                list.remove(i);
                notifyDataSetChanged();
                change.delete();
            }
        });
        return convertView;
    }

    public class ViewHolder{
        TextView lv_title,lv_num,lv_price;
        Button lv_remove,lv_jian,lv_jia;
        ImageView lv_img;
        CheckBox lv_checkbox;
    }
    //1.定义一个接口
    public interface Change{
        void changeMoney();
        void jiaNum();
        void jianNum();
        void delete();
    }
    //3.提供一个为接口对象赋值的方法
    public void getChange(Change change){
        this.change = change;
    }
}


猜你喜欢

转载自blog.csdn.net/love_xxxooo/article/details/79784920
今日推荐