Android用MVP实现的二级列表购物车

主Activity

//实现view层的接口 并且重写接口的方法
public class MainActivity extends AppCompatActivity implements MainViewListener {RecyclerView third_recyclerview;LinearLayout third_pay_linear;CheckBox third_allselect;Button third_submit;TextView edittext, third_totalnum, third_totalprice;private MainPresenter presenter;private ShopAdapter adapter;@Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);third_recyclerview = (RecyclerView) findViewById(R.id.third_recyclerview);third_pay_linear = (LinearLayout) findViewById(R.id.third_pay_linear);third_allselect = (CheckBox) findViewById(R.id.third_allselect);third_totalprice = (TextView) findViewById(R.id.third_totalprice);edittext = (TextView) findViewById(R.id.edittext);third_totalnum = (TextView) findViewById(R.id.third_totalnum);third_submit = (Button) findViewById(R.id.third_submit);presenter = new MainPresenter(this);presenter.getData();adapter = new ShopAdapter(this);LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);third_recyclerview.setLayoutManager(manager);third_recyclerview.setAdapter(adapter);third_allselect.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {adapter.selectAll(third_allselect.isChecked());}});adapter.setListener(new ShopAdapter.UpdateUiListener() {@Override
            public void setTotal(String total, String num, boolean allCheck) {third_allselect.setChecked(allCheck);third_totalnum.setText(num);third_totalprice.setText(total);}});third_submit.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {Intent intent = new Intent(MainActivity.this, WeiXin.class);startActivity(intent);}});}@Override
    public void succer(ShopBean bean) {adapter.add(bean);}@Override
    public void Defeat(Exception e) {Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();}@Override
    protected void onDestroy() {super.onDestroy();presenter.detach();}}
主布局文件

xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zhangyongbo.erjiliebaio.MainActivity"><android.support.v7.widget.RecyclerView
        android:id="@+id/third_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" /><LinearLayout
        android:id="@+id/third_pay_linear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:background="#FFFFFF"
        android:gravity="center_vertical"
        android:orientation="horizontal"><CheckBox
            android:id="@+id/third_allselect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="@dimen/margin_10dp"
            android:checked="false"
            android:drawableLeft="@mipmap/shopcart_selected"
            android:drawablePadding="@dimen/padding_5dp"
            android:text="全选" /><LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical"><TextView
                android:id="@+id/third_totalprice"
                android:layout_width="200dp"
                android:layout_height="wrap_content"
                android:paddingLeft="@dimen/padding_10dp"
                android:paddingTop="@dimen/padding_10dp"
                android:text="总价:"
                android:textColor="@color/cblack"
                android:textSize="@dimen/common_font_size_16" /><TextView
                android:id="@+id/third_totalnum"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingBottom="@dimen/padding_10dp"
                android:paddingLeft="@dimen/padding_10dp"
                android:text="共0件商品"
                android:textColor="@color/cblack"
                android:textSize="@dimen/common_font_size_14" />LinearLayout><Button
            android:id="@+id/third_submit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="@dimen/margin_10dp"
            android:background="@drawable/login_btn"
            android:paddingBottom="@dimen/padding_10dp"
            android:paddingLeft="@dimen/margin_30dp"
            android:paddingRight="@dimen/margin_30dp"
            android:paddingTop="@dimen/padding_10dp"
            android:text="去结算"
            android:textColor="#000000" />LinearLayout>
LinearLayout>
View层

public interface MainViewListener {void succer(ShopBean bean);//成功的方法

    void Defeat(Exception e);//失败的方法
}
modle层

nodle的类

public class MainModel {//获取网路数据  传入Modle的接口
    public void getData(final MainModelCallBack callBack) {OkhttpUtils.getInstance().asy(null, "http://120.27.23.105/product/getCarts?uid=100", new AbstractUiCallBack() {@Override
            public void success(ShopBean shopBean) {//这里用接口的的对象去调用接口的方法
                callBack.succer(shopBean);}@Override
            public void failure(Exception e) {//这里用接口的的对象去调用接口的方法
                callBack.Defeat(e);}});}}
modle的接口

public interface MainModelCallBack {void succer(ShopBean bean);//成功的方法

    void Defeat(Exception e);//失败的方法
}
presenter层

public class MainPresenter {//初始化 Modle层的类 和View层的接口
    MainModel mainModel; //modle的类
    MainViewListener mainViewListener;//View层的接口

    //给有参构造  只给接口 不给Modle层
    public MainPresenter(MainViewListener mainViewListener) {this.mainViewListener = mainViewListener;this.mainModel = new MainModel();}//获取参数  New出来Modle层的接口
    public void getData() {mainModel.getData(new MainModelCallBack() {@Override
            public void succer(ShopBean bean) {//判断数据是否请求成功 请求成功的了
                // 就调取成功的方法 否则就是失败 那就调取失败的方法
                if (mainViewListener != null) {//这是成功的方法
                    mainViewListener.succer(bean);}}@Override
            public void Defeat(Exception e) {//这是失败的方法
                if (mainViewListener != null) {mainViewListener.Defeat(e);}}});}/**
     * 防止内存泄漏
     */
    public void detach() {mainViewListener = null;}
}
下面是购物车的自定义View用于加减号

//这是购物车的自定义View 用来设置购物车的加减号
public class plusview extends LinearLayout  {Button revserse,tianjian;EditText edittext;private  int mcount = 1;//定义一个常量 用于购物车就入时默认显示为1
    public plusview(Context context) {super(context);}public  plusview(Context context, AttributeSet attributeSet){super(context,attributeSet);//首先加载布局文件
        View view = View.inflate(context, R.layout.plus_layout,null);//初始化控件
        revserse = view.findViewById(R.id.revserse);//减号
        tianjian = view.findViewById(R.id.tianjian);//加好
        edittext = view.findViewById(R.id.edittext);//加号减号中间的输入框
        //控件初始化玩之后 控件设置点击事件
        revserse.setOnClickListener(new OnClickListener() {//减号的点击事件
            @Override
            public void onClick(View view) {String trims = edittext.getText().toString().trim();//获取输入框的值去掉空格
                int coun = Integer.valueOf(trims);//把从输入框的得到的值转换成整形
                 if (coun>1){mcount = coun-1;edittext.setText(mcount+"");if (listener!=null){listener.click(mcount);}}}});//加号的点击事件
        tianjian.setOnClickListener(new OnClickListener() {@Override
            public void onClick(View view) {String trim = edittext.getText().toString().trim();//获取输入框的值去掉空格
                int coun = Integer.valueOf(trim)+1;//把从输入框的得到的值转换成整形
                mcount = coun;edittext.setText(coun+"");if (listener!=null){listener.click(coun);}}});//输入框的点击事件
        edittext.addTextChangedListener(new TextWatcher() {@Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}@Override
            public void afterTextChanged(Editable editable) {}});addView(view);  //添加布局

    }public plusview(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public void setEditText(int num){if(edittext != null){edittext.setText(num+"");}}public ClickListener listener;public void setListener(ClickListener listener ){this.listener=listener;}/**
     * 加减号的点击事件
     */
    public  interface  ClickListener{public void click(int coun);}
}
购物车的适配器


//适配器
public class ShopAdapter extends RecyclerView.Adapter {private Context context;//传入上下文
    private List list;//bean包的集合
    //存放商家的集合
    private Map map = new HashMap<>();//有参构造
    public ShopAdapter(Context context) {this.context = context;}/**
     * 添加数据并更新
     */
    public void add(ShopBean bean) {//判段如果list是空的
        if (this.list == null) {//那就把listNew出来
            this.list = new ArrayList<>();}//遍历商家
        for (ShopBean.DataBean shop : bean.getData()) {map.put(shop.getSellerid(), shop.getSellerName());// 遍历商品
            for (int i = 0; i < shop.getList().size(); i++) {this.list.add(shop.getList().get(i));}}setFirst(this.list);  //控制是否显示商家
        notifyDataSetChanged();//更新数据
    }/**
     * 设置数据源, 控制显示商家
     *
     * @param list 这里把集合给setFirst这个方法就是要设置商品的显示与阴藏
     */
    private void setFirst(List list) {//这里判断  如果集合的字符大于0 你就默认显示一个商家
        if (list.size() > 0) {list.get(0).setIsFirst(1);   //这是默认显示商家
            for (int i = 1; i < list.size(); i++) {  //这是For循环把集合里的所有元素循出来
                if (list.get(i).getSellerid() == list.get(i - 1).getSellerid()) {//如果俩个商品是同一个商家的那么就让这两个商品只显示一个商家
                    list.get(i).setIsFirst(2);} else {//如果不是 就两个都显示
                    list.get(i).setIsFirst(1);if (list.get(i).isItemSelected()) {list.get(i).setShopSelected(list.get(i).isItemSelected());}}}}}/**
     * 加载布局文件
     */
    @Override
    public ShopAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = View.inflate(context, R.layout.adapter_layout, null);//添加到ViewHolder里
        return new ViewHolder(view);}@Override
    public void onBindViewHolder(final ShopAdapter.ViewHolder holder, final int position) {// 显示商品图片
        if (list.get(position).getIsFirst() == 1) {//显示商家  VISIBLE显示商品
            holder.shop_checkbox.setVisibility(View.VISIBLE);//显示商家
            holder.tv_item_shopcart_shopname.setVisibility(View.VISIBLE);//显示商家
            holder.shop_checkbox.setChecked(list.get(position).isShopSelected());//            显示商家的名称
//            list.get(position).getSellerid() 取到商家的id
//            map.get()取到 商家的名称
            holder.tv_item_shopcart_shopname.setText(map.get(String.valueOf(list.get(position).getSellerid())));} else {holder.shop_checkbox.setVisibility(View.GONE);//隐藏商家
            holder.tv_item_shopcart_shopname.setVisibility(View.GONE);//隐藏商家
        }//控制 商品的  checkbox
        holder.item_checkbox.setChecked(list.get(position).isItemSelected());//这是分割  由于接口中的图片是连这的所以必须要分割
        String[] url = list.get(position).getImages().split("\\|");// 从分割完之后返回的数组中设置所要显示的图片
        ImageLoader.getInstance().displayImage(url[0], holder.item_pic);//设置所要显示的文字 也是商家
        holder.item_name.setText(list.get(position).getTitle());//设置所要显示的价格
        holder.item_price.setText(list.get(position).getPrice() + "");//计算完所友的商品总价后在这设置显示
        holder.plus_view_id.setEditText(list.get(position).getNum());// 商家的checkbox  多选框
        holder.shop_checkbox.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {list.get(position).setShopSelected(holder.shop_checkbox.isChecked());for (int i = 0; i < list.size(); i++) {if (list.get(position).getSellerid() == list.get(i).getSellerid()) {list.get(i).setItemSelected(holder.shop_checkbox.isChecked());}}notifyDataSetChanged();//更新数据源
                sum(list);//计算总价

            }});// 商品的checkbox  多选框
        holder.item_checkbox.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {list.get(position).setItemSelected(holder.item_checkbox.isChecked());for (int i = 0; i < list.size(); i++) {for (int j = 0; j < list.size(); j++) {if (list.get(i).getSellerid() == list.get(j).getSellerid() && !list.get(j).isItemSelected()) {list.get(i).setShopSelected(false);break;} else {list.get(i).setShopSelected(true);}}}notifyDataSetChanged();//更新数据源
                sum(list);//计算总价

            }});//删除的点击事件
        holder.item_del.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View view) {//从集合中移除商家信息
                list.remove(position);setFirst(list);notifyDataSetChanged();//更新数据
                sum(list);//算总价

            }});//加减号
        holder.plus_view_id.setListener(new plusview.ClickListener() {@Override
            public void click(int count) {list.get(position).setNum(count);notifyDataSetChanged();//更新适配器
                sum(list);//计算总价
            }});}@Override
    public int getItemCount() {return list == null ? 0 : list.size();//三元运算符
    }/**
     * 计算总价
     *
     * @param list
     */
    private void sum(List list) {int totalNum = 0;float totalMoney = 0.0f;boolean allCheck = true;for (int i = 0; i < list.size(); i++) {if (list.get(i).isItemSelected()) {totalNum += list.get(i).getNum();totalMoney += list.get(i).getNum() * list.get(i).getPrice();} else {allCheck = false;}}listener.setTotal(totalMoney + "", totalNum + "", allCheck);}public void selectAll(boolean cl) {for (int i = 0; i < list.size(); i++) {list.get(i).setShopSelected(cl);list.get(i).setItemSelected(cl);}notifyDataSetChanged();sum(list);}public class ViewHolder extends RecyclerView.ViewHolder {View view, item_del;plusview plus_view_id;CheckBox shop_checkbox, item_checkbox;TextView tv_item_shopcart_shopname, item_price, item_name, tv_item_shopcart_cloth_size;ImageView item_pic;public ViewHolder(View itemView) {super(itemView);view = itemView.findViewById(R.id.view);item_del = itemView.findViewById(R.id.item_del);shop_checkbox = itemView.findViewById(R.id.shop_checkbox);item_checkbox = itemView.findViewById(R.id.item_checkbox);tv_item_shopcart_shopname = itemView.findViewById(R.id.tv_item_shopcart_shopname);item_price = itemView.findViewById(R.id.item_price);item_name = itemView.findViewById(R.id.item_name);tv_item_shopcart_cloth_size = itemView.findViewById(R.id.tv_item_shopcart_cloth_size);item_pic = itemView.findViewById(R.id.item_pic);plus_view_id = itemView.findViewById(R.id.plus_view_id);}}public UpdateUiListener listener;public void setListener(UpdateUiListener listener) {this.listener = listener;}//更新接口数据
    public interface UpdateUiListener {public void setTotal(String total, String num, boolean allCheck);}
}

子布局文件

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="wrap_content"
    android:background="@color/cwhite"
    android:orientation="vertical"><LinearLayout
        android:id="@+id/ll_shopcart_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"><View
            android:id="@+id/view"
            android:layout_width="match_parent"
            android:layout_height="@dimen/margin_10dp"
            android:background="@color/background_color" /><LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical">

            <CheckBox
                android:id="@+id/shop_checkbox"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingBottom="@dimen/margin_10dp"
                android:paddingLeft="@dimen/margin_15dp"
                android:paddingRight="@dimen/margin_15dp"
                android:paddingTop="@dimen/margin_10dp"
                android:src="@mipmap/shopcart_selected" />
            <TextView
                android:id="@+id/tv_item_shopcart_shopname"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawableLeft="@mipmap/shopcart_shop"
                android:drawablePadding="@dimen/padding_5dp"
                android:padding="@dimen/padding_10dp"
                android:text="宝儿家服装"
                android:textColor="@color/cblack" />LinearLayout>LinearLayout><LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"><LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"><View
                android:layout_width="match_parent"
                android:layout_height="@dimen/margin_1dp"
                android:background="@color/background_color" /><LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal">
                <CheckBox
                    android:id="@+id/item_checkbox"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="@dimen/margin_15dp"
                    android:src="@mipmap/shopcart_selected" />
                <ImageView
                    android:id="@+id/item_pic"
                    android:layout_width="60dp"
                    android:layout_height="60dp"
                    android:layout_margin="@dimen/margin_10dp" /><LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:orientation="vertical"><TextView
                        android:id="@+id/item_price"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="¥185"
                        android:textColor="@color/main_red_text"
                        android:textSize="@dimen/common_font_size_14" /><LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginBottom="@dimen/margin_5dp"
                        android:layout_marginTop="@dimen/margin_5dp"><TextView
                            android:id="@+id/item_name"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:text="颜色:黑色"
                            android:textColor="@color/cblack"
                            android:textSize="@dimen/common_font_size_12" /><TextView
                            android:id="@+id/tv_item_shopcart_cloth_size"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_marginLeft="@dimen/margin_10dp"
                            android:text="尺寸:XL"
                            android:textColor="@color/cblack"
                            android:textSize="@dimen/common_font_size_12" />LinearLayout><com.zhangyongbo.erjiliebaio.PlusView.plusview
                        android:id="@+id/plus_view_id"
                        android:layout_width="100dp"
                        android:layout_height="wrap_content">com.zhangyongbo.erjiliebaio.PlusView.plusview>LinearLayout><View
                    android:layout_width="@dimen/margin_1dp"
                    android:layout_height="match_parent"
                    android:layout_marginBottom="@dimen/padding_10dp"
                    android:layout_marginTop="@dimen/padding_10dp"
                    android:background="@color/splitline_color" /><ImageView
                    android:id="@+id/item_del"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="@dimen/margin_20dp"
                    android:src="@mipmap/shopcart_delete" />LinearLayout>LinearLayout>LinearLayout><View
        android:layout_width="match_parent"
        android:layout_height="@dimen/margin_1dp"
        android:background="@color/background_color" />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="horizontal"><Button
        android:id="@+id/revserse"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:background="#FF00"
        android:text="-"

        /><EditText
        android:id="@+id/edittext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="number"

        android:text="1" /><Button
        android:id="@+id/tianjian"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:background="#FF00"
        android:text="+" />
LinearLayout>

我这里用的是Imageloade需要配置文件下面是我的配置文件

/**
 * 这是配置ImageLoage的  配置完要在清单文件中注册
 */
public class MyApps extends Application {@Override
    public void onCreate() {super.onCreate();File file = new File(Environment.getExternalStorageDirectory().getPath()+"Images0718");ImageLoaderConfiguration conn = new ImageLoaderConfiguration.Builder(this).threadPoolSize(5).memoryCacheExtraOptions(80, 80).memoryCacheSize(2 * 1024 * 1024).threadPriority(1000).diskCacheFileNameGenerator(new Md5FileNameGenerator()).diskCacheSize(50 * 1024 * 1024).build();ImageLoader.getInstance().init(conn);}
}
我用的是OkHttp请求下面是我封装的OkHttp

//Okhttp 单例 范型的封装
public  abstract  class AbstractUiCallBack<T> implements Callback {/**
     * 成功回调
     * @param t
     */
    public abstract void success(T t);/**
     * 失败回调
     * @param e
     */
    public abstract void failure(Exception e);private Handler handler = null ;private Class clazz ;public AbstractUiCallBack(){handler = new Handler(Looper.getMainLooper());//  得到的是一个 AbstractUiCallBack 的Type
       Type type =  getClass().getGenericSuperclass() ;// 得到的是T的实际Type
       Type [] arr =  ((ParameterizedType)type).getActualTypeArguments() ;clazz = (Class) arr[0] ;}@Override
    public void onFailure(Call call, IOException e) {failure(e);}@Override
    public void onResponse(Call call, Response response) throws IOException {try {String result = response.body().string();System.out.println("result = " + result);Gson gson = new Gson();final T t = (T) gson.fromJson(result,clazz);handler.post(new Runnable() {@Override
                public void run() {success(t);}});} catch (IOException e) {e.printStackTrace();failure(e);} catch (JsonSyntaxException e) {e.printStackTrace();failure(e);}}
}
//Okhttp 单例 范型的封装
public class OkhttpUtils {private static OkhttpUtils okhttpUtils = null;private OkhttpUtils() {}public static OkhttpUtils getInstance() {if (okhttpUtils == null) {okhttpUtils = new OkhttpUtils();client = new OkHttpClient.Builder().readTimeout(20, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).connectTimeout(20, TimeUnit.SECONDS).addInterceptor(new LoggingInterceptor()).build();}return okhttpUtils;}private static OkHttpClient client;public void asy(Map params, String url, AbstractUiCallBack callBack) {Request request = null;if (params != null) {FormBody.Builder builder = new FormBody.Builder();for (Map.Entry entry : params.entrySet()) {builder.add(entry.getKey(), entry.getValue());}FormBody body = builder.build();request = new Request.Builder().url(url).post(body).build();} else {request = new Request.Builder().url(url).build();}client.newCall(request).enqueue(callBack);}private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");public static void postFile(Map map, String url, File file, AbstractUiCallBack callBack) {String[] array = file.getAbsolutePath().split("\\/");MultipartBody.Builder builder = new MultipartBody.Builder();builder.setType(MultipartBody.FORM);for (Map.Entry entry : map.entrySet()) {builder.addFormDataPart(entry.getKey(), entry.getValue());}builder.addFormDataPart("imageFileName", array[array.length - 1]);if (file.exists() && file.length() > 0) {builder.addFormDataPart("image", array[array.length - 1], RequestBody.create(MEDIA_TYPE_PNG, file));}MultipartBody body = builder.build();Request request = new Request.Builder().url(url).post(body).build();client.newCall(request).enqueue(callBack);}}
下面是拦截器的封装

//拦截器
public class LoggingInterceptor implements Interceptor {@Override public Response intercept(Chain chain) throws IOException {Request request = chain.request();long t1 = System.nanoTime();
//    logger.info(String.format("Sending request %s on %s%n%s",
//        request.url(), chain.connection(), request.headers()));

    Response response = chain.proceed(request);long t2 = System.nanoTime();
//    logger.info(String.format("Received response for %s in %.1fms%n%s",
//        response.request().url(), (t2 - t1) / 1e6d, response.headers()));

    System.out.println("t2 = " + (t2-t1));return response;}
}
我这里用到了一些图片需要自己去阿里巴巴矢量图标库下载

还需要在drawble下面配置一下这个

xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="108dp"
    android:height="108dp"
    android:viewportHeight="108"
    android:viewportWidth="108"><path
        android:fillColor="#26A69A"
        android:pathData="M0,0h108v108h-108z" /><path
        android:fillColor="#00000000"
        android:pathData="M9,0L9,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,0L19,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M29,0L29,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M39,0L39,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M49,0L49,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M59,0L59,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M69,0L69,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M79,0L79,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M89,0L89,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M99,0L99,108"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,9L108,9"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,19L108,19"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,29L108,29"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,39L108,39"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,49L108,49"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,59L108,59"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,69L108,69"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,79L108,79"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,89L108,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M0,99L108,99"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,29L89,29"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,39L89,39"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,49L89,49"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,59L89,59"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,69L89,69"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M19,79L89,79"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M29,19L29,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M39,19L39,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M49,19L49,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M59,19L59,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M69,19L69,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" /><path
        android:fillColor="#00000000"
        android:pathData="M79,19L79,89"
        android:strokeColor="#33FFFFFF"
        android:strokeWidth="0.8" />
vector>
第二个

xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="@dimen/height_200dp">corners><solid android:color="@color/pressed_icon_color">solid>
shape>

第三个
xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="@dimen/height_200dp">corners><stroke android:color="@color/background_color" android:width="1dp">stroke>
shape>
在Values下配置Color
xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#3F51B5color><color name="colorPrimaryDark">#303F9Fcolor><color name="colorAccent">#FF4081color><color name="cwhite">#FFFFFFcolor><color name="title_bg">#FDE23Dcolor><color name="tab_bg">#FFFFFFcolor><color name="tab_normal_textcolor">#373737color><color name="tab_selected_textcolor">#FDE23Dcolor><color name="coffer">#442509color><color name="pressed_icon_color">#e53e42color><color name="background_color">#f6f6f6color><color name="main_red_text">#e53e42color><dimen name="padding_20dp">20dpdimen><color name="splitline_color">#ddddddcolor><color name="cblack">#000000color>
resources>
配置diment
<resources>
    <dimen name="activity_horizontal_margin">16dpdimen><dimen name="activity_vertical_margin">16dpdimen><dimen name="margin_10dp">10dpdimen><dimen name="padding_5dp">5dpdimen><dimen name="padding_10dp">10dpdimen><dimen name="common_font_size_16">16spdimen><dimen name="common_font_size_14">14spdimen><dimen name="height_200dp">200dpdimen><dimen name="margin_30dp">30dpdimen><dimen name="margin_15dp">15dpdimen><dimen name="margin_1dp">1dpdimen><dimen name="margin_5dp">5dpdimen><dimen name="common_font_size_12">12spdimen><dimen name="padding_2dp">2dpdimen><dimen name="margin_20dp">20dpdimen>
resources>
Bean包需要自己写三个属性
// 1 显示商家  2 隐藏商家
private int isFirst;// true 表示商家选中 false 相反
private boolean shopSelected;// true 表示 当前商品是选中的 false 相反
private boolean itemSelected;


清单文件需要的配置
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
所用到的依赖
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okio:okio:1.7.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
compile 'com.jakewharton:butterknife:7.0.0'
compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部