Android权限
<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"/>
依赖
implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.squareup.okhttp3:okhttp:3.6.0' implementation 'com.squareup.okio:okio:1.11.0' implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.github.bumptech.glide:glide:3.7.0'
layout-main:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context=".MainActivity"> <LinearLayout android:id="@+id/linear" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <EditText android:id="@+id/sousuo" android:background="@null" android:layout_weight="8" android:layout_width="0dp" android:layout_height="wrap_content" /> <Button android:id="@+id/sousuo_btn" android:text="搜索" android:layout_weight="2" android:layout_width="0dp" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:id="@+id/qingkong" android:layout_width="15dp" android:layout_height="15dp" android:layout_below="@id/linear" android:background="@mipmap/qingkong"/> <com.bwie.dongyushan.liu.LiuShi android:id="@+id/liushi" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/linear"></com.bwie.dongyushan.liu.LiuShi> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@id/liushi"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/recylerView"></android.support.v7.widget.RecyclerView> <View android:layout_width="match_parent" android:layout_height="50dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="60dp" android:orientation="horizontal" android:id="@+id/bottom_linear" android:layout_alignParentBottom="true" android:background="#fff"> <CheckBox android:id="@+id/cb_01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/quanxuan" android:layout_gravity="center_vertical" android:text="全选" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" android:id="@+id/linear02" android:layout_gravity="center_vertical" android:layout_marginLeft="20dp"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="总价:¥0" android:id="@+id/zongjia_text"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="共0件商品" android:layout_marginTop="5dp" android:id="@+id/num_shop"/> </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="去结算" android:id="@+id/jiesuan" android:layout_gravity="center_vertical" android:padding="5dp" android:textColor="#fff" android:background="@drawable/yuan"/> </LinearLayout> </RelativeLayout>
MainActivity
package com.bwie.dongyushan; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.bwie.dongyushan.adapter.MyAdapter; import com.bwie.dongyushan.bean.UserBean; import com.bwie.dongyushan.liu.LiuShi; import com.bwie.dongyushan.presenter.MyPresenter; import com.bwie.dongyushan.view.MyView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements MyView{ private RecyclerView recyclerView; private MyPresenter myPresenter; private List<UserBean.DataBean> data; private List<UserBean> list01; private EditText sousuo; private Button sousuo_btn; private LiuShi liuShi; private List<String> list=new ArrayList<>(); private TextView qingkong; private CheckBox cb_01; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recylerView); myPresenter = new MyPresenter(this); liuShi = findViewById(R.id.liushi); sousuo=findViewById(R.id.sousuo); sousuo_btn=findViewById(R.id.sousuo_btn); qingkong = findViewById(R.id.qingkong); cb_01 = findViewById(R.id.cb_01); cb_01.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(cb_01.isChecked()){ for (int i = 0; i <data.size() ; i++) { data.get(i).setMychecked(true); for (int j = 0; j <data.get(i).getList().size() ; j++) { data.get(i).getList().get(j).setSeedchecked(true); } } }else { for (int i = 0; i <data.size() ; i++) { data.get(i).setMychecked(false); for (int j = 0; j <data.get(i).getList().size() ; j++) { data.get(i).getList().get(j).setSeedchecked(false); } } } adapter.notifyDataSetChanged(); } }); qingkong = findViewById(R.id.qingkong); qingkong.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.clear(); liuShi.removeAllViews(); } }); sousuo_btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String st= sousuo.getText().toString(); list.add(st); liuShi.removeAllViews(); for (int i=0;i<list.size();i++){ TextView tv=new TextView(MainActivity.this); tv.setText(list.get(i)); liuShi.addView(tv); } liuShi.setPadding(5,5,5,5); } }); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false)); myPresenter.show(); } //成功 @Override public void success(final UserBean userBean) { runOnUiThread(new Runnable() { @Override public void run() { data = userBean.getData(); // Toast.makeText(MainActivity.this,data.size()+"",Toast.LENGTH_SHORT).show(); adapter = new MyAdapter(data, MainActivity.this); recyclerView.setAdapter(adapter); } }); } //失败 @Override public void failure(final String msg) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show(); } }); } }
MyView
package dongyushan.bwie.com.bai.view;
import dongyushan.bwie.com.bai.bean.UserBean;
public interface MyView {
void success(UserBean userBean);
void failure(String msg);
}
OkHttpUtils
package dongyushan.bwie.com.bai.utils;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import dongyushan.bwie.com.bai.event.RequestCallback;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class OkHttpUtils {
private static OkHttpUtils okHttpUtils;
private OkHttpClient okHttpClient;
private OkHttpUtils(){
okHttpClient=new OkHttpClient.Builder()
.writeTimeout(5, TimeUnit.SECONDS)
.readTimeout(5,TimeUnit.SECONDS)
.connectTimeout(5,TimeUnit.SECONDS)
.build();
}
public static OkHttpUtils getInstance(){
if (okHttpUtils==null){
synchronized (OkHttpUtils.class){
if (okHttpUtils==null){
okHttpUtils=new OkHttpUtils();
}
}
}
return okHttpUtils;
}
public void postData(String url, HashMap<String,String> prams, final RequestCallback requestCallback){
FormBody.Builder formBodyBuilder = new FormBody.Builder();
if (prams!=null&&prams.size()>0){
for (Map.Entry<String,String> stringStringEntry:prams.entrySet()){
formBodyBuilder.add(stringStringEntry.getKey(),stringStringEntry.getValue());
}
}
final Request request = new Request.Builder()
.url(url).post(formBodyBuilder.build()).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if (requestCallback!=null){
requestCallback.failure(call,e);
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (requestCallback != null) {
String string = response.body().string();
requestCallback.success(call,string);
}
}
});
}
}
MyPresenter
package dongyushan.bwie.com.bai.presenter;
import com.google.gson.Gson;
import java.io.IOException;
import dongyushan.bwie.com.bai.bean.UserBean;
import dongyushan.bwie.com.bai.event.RequestCallback;
import dongyushan.bwie.com.bai.model.MyModel;
import dongyushan.bwie.com.bai.view.MyView;
import okhttp3.Call;
public class MyPresenter {
private MyView myView;
private MyModel myModel;
public MyPresenter(MyView myView) {
this.myView = myView;
myModel=new MyModel();
}
public void show(){
myModel.show(new RequestCallback() {
@Override
public void success(Call call, String s) {
Gson gson=new Gson();
UserBean userBean=gson.fromJson(s,UserBean.class);
myView.success(userBean);
}
@Override
public void failure(Call call, IOException e) {
myView.failure("失败");
}
});
}
}
MyModel
package dongyushan.bwie.com.bai.model;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.HashMap;
import dongyushan.bwie.com.bai.bean.UserBean;
import dongyushan.bwie.com.bai.event.RequestCallback;
import dongyushan.bwie.com.bai.utils.OkHttpUtils;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MyModel {
//private OkHttpClient okHttpClient;
private HashMap<String,String> parms;
public void show(RequestCallback requestCallback){
parms=new HashMap<>();
parms.put("uid","71");
OkHttpUtils.getInstance().postData("https://www.zhaoapi.cn/product/getCarts",parms,requestCallback);
// okHttpClient=new OkHttpClient();
// FormBody formBody=new FormBody.Builder()
// .add("uid","71")
// .build();
//
// Request request=new Request.Builder()
// .url("https://www.zhaoapi.cn/product/getCarts")
// .post(formBody)
// .build();
//
// okHttpClient.newCall(request).enqueue(new Callback() {
// @Override
// public void onFailure(Call call, IOException e) {
// showCallBack.failure("失败");
// }
//
// @Override
// public void onResponse(Call call, Response response) throws IOException {
// String string=response.body().string();
// Gson gson=new Gson();
// UserBean userBean=gson.fromJson(string,UserBean.class);
// showCallBack.success(userBean);
// }
// });
}
}
even-RequestCallBack
package dongyushan.bwie.com.bai.event;
import java.io.IOException;
import okhttp3.Call;
public interface RequestCallback {
void success(Call call,String s);
void failure(Call call, IOException e);
}
MyAdapter
package com.bwie.dongyushan.adapter; import android.content.Context; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; import com.bwie.dongyushan.R; import com.bwie.dongyushan.bean.UserBean; import java.util.List; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ private List<UserBean.DataBean> list; private Context context; public MyAdapter(List<UserBean.DataBean> list, Context context) { this.list = list; this.context = context; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false); MyViewHolder myViewHolder=new MyViewHolder(view); return myViewHolder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.cb_02.setChecked(list.get(position).isMychecked()); holder.shangdian_name_text.setText(list.get(position).getSellerName()); holder.recyclerView_seed.setLayoutManager(new LinearLayoutManager(context)); SeedAdapter seedAdapter = new SeedAdapter(list.get(position).getList(), context); holder.recyclerView_seed.setAdapter(seedAdapter); } @Override public int getItemCount() { return list.size()==0?0:list.size(); } class MyViewHolder extends RecyclerView.ViewHolder{ private CheckBox cb_02; private TextView shangdian_name_text; private RecyclerView recyclerView_seed; public MyViewHolder(View itemView) { super(itemView); shangdian_name_text=itemView.findViewById(R.id.shangdian_name_text); recyclerView_seed=itemView.findViewById(R.id.recyclerView_seed); cb_02 = itemView.findViewById(R.id.cb_02); } } }
SeedAdapter
package com.bwie.dongyushan.adapter; import android.content.Context; 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.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bwie.dongyushan.R; import com.bwie.dongyushan.bean.UserBean; import java.util.List; public class SeedAdapter extends RecyclerView.Adapter<SeedAdapter.MyViewHolder2>{ private List<UserBean.DataBean.ListBean> list; private Context context; public SeedAdapter(List<UserBean.DataBean.ListBean> list, Context context) { this.list = list; this.context = context; } @Override public MyViewHolder2 onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.seed_item, parent, false); MyViewHolder2 myViewHolder2=new MyViewHolder2(view); return myViewHolder2; } @Override public void onBindViewHolder(final MyViewHolder2 holder, int position) { holder.cb_03.setChecked(list.get(position).isseedchecked()); holder.shangpin_price_text.setText(list.get(position).getPrice()+""); holder.shangpin_name_text.setText(list.get(position).getTitle()); String images = list.get(position).getImages(); String[] split=images.split("\\|"); String a=split[0].toString(); Log.i("aaa",a); Glide.with(context).load(split[0]).into(holder.shangpin_image); //点击加号 holder.jia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int num1 = Integer.parseInt(holder.num.getText().toString()); num1+=2; holder.num.setText(num1+""); } }); //点击减号 holder.jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int num1 = Integer.parseInt(holder.num.getText().toString()); if (num1<=1){ }else { num1-=1; holder.num.setText(num1+""); } } }); } @Override public int getItemCount() { return list.size(); } public class MyViewHolder2 extends RecyclerView.ViewHolder{ private CheckBox cb_03; private TextView shangpin_name_text,shangpin_price_text,num; private ImageView shangpin_image,jia,jian; public MyViewHolder2(View itemView) { super(itemView); shangpin_name_text = itemView.findViewById(R.id.shangpin_name_text); shangpin_price_text = itemView.findViewById(R.id.shangpin_price_text); shangpin_image = itemView.findViewById(R.id.shangpin_image); jia=itemView.findViewById(R.id.jia); jian=itemView.findViewById(R.id.jian); num=itemView.findViewById(R.id.num); cb_03 = itemView.findViewById(R.id.cb_03); } } }
layout-item
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <View android:layout_width="match_parent" android:layout_height="10dp" android:background="#D3D3D3"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cb_02" android:layout_margin="10dp"/> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:background="@mipmap/shangdian" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/shangdian_name_text" android:text="商店名" android:layout_marginTop="10dp"/> </LinearLayout> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#D3D3D3"/> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/recyclerView_seed"></android.support.v7.widget.RecyclerView> </LinearLayout>
seed-item
<?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"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginLeft="20dp" android:id="@+id/cb_03"/> <ImageView android:layout_width="80dp" android:layout_height="80dp" android:background="@mipmap/ic_launcher" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:id="@+id/shangpin_image" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="vertical" android:layout_gravity="center_vertical" android:layout_weight="1"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/shangpin_name_text" android:text="商品名称" android:layout_marginLeft="20dp" android:layout_marginTop="10dp"/> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/shangpin_price_text" android:text="商品价格" android:layout_marginLeft="20dp" android:layout_marginTop="10dp"/> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_marginLeft="20dp" android:layout_marginTop="10dp" android:background="@mipmap/jian" android:id="@+id/jian"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1" android:layout_margin="10dp" android:id="@+id/num"/> <ImageView android:id="@+id/jia" android:layout_width="20dp" android:layout_height="20dp" android:layout_marginTop="10dp" android:background="@mipmap/jia"/> </LinearLayout> </LinearLayout> <View android:layout_width="1dp" android:layout_height="80dp" android:background="#D3D3D3" android:layout_marginTop="10dp"/> <ImageView android:layout_width="30dp" android:layout_height="30dp" android:background="@mipmap/shanchu" android:layout_gravity="center_vertical" android:layout_marginLeft="20dp" android:layout_marginRight="20dp"/> </LinearLayout> </LinearLayout>
liushi
package com.bwie.dongyushan.liu; import android.content.Context; import android.util.AttributeSet; import android.view.ViewGroup; public class LiuShi extends ViewGroup { private int mLeftMargin = 20; private int mTopMargin = 20; public LiuShi(Context context) { this(context,null); } public LiuShi(Context context, AttributeSet attrs) { this(context, attrs,0); } public LiuShi(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measureChildren(widthMeasureSpec,heightMeasureSpec); int leftMargin = mLeftMargin; int topMargin = mTopMargin; int ViewWidth = 0; int ViewHeight = 0; int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); int modelWidth = MeasureSpec.getMode(widthMeasureSpec); int modelHeight = MeasureSpec.getMode(heightMeasureSpec); switch (modelHeight){ case MeasureSpec.AT_MOST: int measuredHeight = 0; for (int i = 0; i < getChildCount(); i++) { int measuredWidth = getChildAt(i).getMeasuredWidth(); measuredHeight = getChildAt(i).getMeasuredHeight(); if (leftMargin+measuredWidth+mLeftMargin > getWidth()){ leftMargin = mLeftMargin; topMargin += measuredHeight+mTopMargin; } leftMargin += measuredWidth + mLeftMargin; } topMargin += measuredHeight+mTopMargin; break; } setMeasuredDimension(sizeWidth,topMargin); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int leftMargin = mLeftMargin; int topMargin = mTopMargin; for (int i = 0; i < getChildCount(); i++) { int measuredWidth = getChildAt(i).getMeasuredWidth(); int measuredHeight = getChildAt(i).getMeasuredHeight(); if (leftMargin+measuredWidth+mLeftMargin > getWidth()){ leftMargin = mLeftMargin; topMargin += measuredHeight+mTopMargin; getChildAt(i).layout(leftMargin,topMargin,leftMargin+measuredWidth,topMargin+measuredHeight); }else { getChildAt(i).layout(leftMargin,topMargin,leftMargin+measuredWidth,topMargin+measuredHeight); } leftMargin+=measuredWidth+mLeftMargin; } } }
custom
package com.bwie.dongyushan.view; import android.content.Context; import android.util.AttributeSet; import android.view.ViewGroup; public class CustomView extends ViewGroup { private int mleftMargin=20; private int mtopMargin=20; public CustomView(Context context) { this(context,null); } public CustomView(Context context, AttributeSet attrs) { this(context, attrs,0); } public CustomView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onLayout(boolean b, int i, int i1, int i2, int i3) { int leftMargin = mleftMargin; int topMargin = mtopMargin; for (int j = 0; j < getChildCount(); j++) { int measuredWidth = getChildAt(j).getMeasuredWidth(); int measuredHeight = getChildAt(j).getMeasuredHeight(); if (leftMargin+measuredWidth+mleftMargin>getWidth()){ leftMargin=mleftMargin; topMargin+=measuredHeight+mtopMargin; getChildAt(j).layout(leftMargin,topMargin,leftMargin+measuredWidth,topMargin+measuredHeight); }else { getChildAt(j).layout(leftMargin,topMargin,leftMargin+measuredWidth,topMargin+measuredHeight); } leftMargin+=measuredWidth+mleftMargin; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); measureChildren(widthMeasureSpec,heightMeasureSpec); int leftMargin = mleftMargin; int topMargin = mtopMargin; int viewHeight = 0; int viewWidth = 0; //父控件传进来的宽度和高度以及对应的测量模式 int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); int modeWidth = MeasureSpec.getMode(widthMeasureSpec); int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); int modeHeight = MeasureSpec.getMode(heightMeasureSpec); switch (modeHeight){ case MeasureSpec.AT_MOST: int measuredHeight = 0; for (int j = 0; j < getChildCount(); j++) { int measuredWidth = getChildAt(j).getMeasuredWidth(); measuredHeight = getChildAt(j).getMeasuredHeight(); if (leftMargin+measuredWidth+mleftMargin>getWidth()){ leftMargin=mleftMargin; topMargin+=measuredHeight+mtopMargin; } leftMargin+=measuredWidth+mleftMargin; } topMargin+=measuredHeight+mtopMargin; break; } setMeasuredDimension(sizeWidth,topMargin); } }