implementation 'com.squareup.okhttp3:okhttp:3.2.0'
implementation 'com.squareup.okio:okio:1.7.0' okHttp依赖
------------------------------------------------------------------
implementation 'com.android.support:recyclerview-v7:28.+' recyclerview的依赖
implementation 'com.github.bumptech.glide:glide:4.9.0' glide 图片依赖
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
在这里插入代码片
1. 主布局
<?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"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/rlv"
></android.support.v7.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<CheckBox
android:layout_width="0dp"
android:layout_weight="1"
android:id="@+id/check"
android:button="@drawable/setecelt"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="全选"
/>
<TextView
android:layout_width="40dp"
android:id="@+id/total"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="合计:"
/>
<TextView
android:layout_width="50dp"
android:layout_height="wrap_content"
android:text="¥123"
android:textColor="#f00"
android:layout_gravity="center"
/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:id="@+id/balance"
android:text="去结算"
android:background="#f00"
/>
</LinearLayout>
</LinearLayout>
2. 子布局
<?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"
android:background="@drawable/but_shape"
>
<LinearLayout
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
>
<CheckBox
android:id="@+id/item_check"
android:button="@drawable/setecelt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
/>
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/item_image1"
android:src="@mipmap/ic_launcher"
android:layout_marginLeft="10dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_marginLeft="20dp"
android:layout_height="0dp"
android:text="11"
android:gravity="center_vertical"
android:id="@+id/item_id1"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center_vertical"
android:layout_weight="1"
android:text="ssssssssss"
android:id="@+id/item_text1"
android:layout_marginLeft="20dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:layout_marginLeft="20dp"
>
<TextView
android:id="@+id/item_price"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="118.0"
android:textColor="#f00"
/>
<com.bw.shopping.view.NumView
android:id="@+id/nv"
android:layout_width="wrap_content"
android:layout_height="match_parent"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout
3. 自定义加减器布局
<?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="wrap_content"
android:layout_height="wrap_content"
android:background="#FFC7BEBE"
android:gravity="center_vertical"
android:orientation="horizontal">
<Button
android:id="@+id/sub"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:background="#fff"
android:text="-"
android:textSize="25sp" />
<EditText
android:id="@+id/edit_num"
android:layout_width="50dp"
android:layout_height="match_parent"
android:background="@null"
android:gravity="center"
android:text="1" />
<Button
android:id="@+id/add"
android:layout_width="25dp"
android:layout_height="wrap_content"
android:background="#fff"
android:text="+"
android:textSize="25sp" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
4. 自定义加减器的类
package com.bw.shopping.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.bw.shopping.R;
public class NumView extends LinearLayout {
private Button sub, add;
private EditText edit_num;
private int num;
public NumView(Context context) {
super(context);
}
public NumView(final Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.layout_num, this);
sub = findViewById(R.id.sub);
add = findViewById(R.id.add);
edit_num = findViewById(R.id.edit_num);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
num++;
edit_num.setText(num + "");
}
});
sub.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (num > 1) {
num--;
} else {
Toast.makeText(context, "可以停了", Toast.LENGTH_SHORT).show();
}
edit_num.setText(num + "");
}
});
}
public NumView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
1. CheckBox变成圆形 在drawable里面设置
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/checkbox_checked" android:state_pressed="true">
</item>
<item android:drawable="@mipmap/checkbox_checked" android:state_checked="true">
</item>
<item android:drawable="@mipmap/checkbox_unchecked">
</item>
</selector>
2. Activity
package com.bw.shopping;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.TextView;
import com.bw.shopping.adapter.MyAdapter;
import com.bw.shopping.bean.Data;
import com.bw.shopping.presenter.Showpresenter;
import com.bw.shopping.view.ShowView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements ShowView ,View.OnClickListener {
private CheckBox check;
private TextView total;
private Button balance;
private Showpresenter showpresenter;
private RecyclerView rlv;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rlv = findViewById(R.id.rlv);
check = findViewById(R.id.check);
total = findViewById(R.id.total);
balance = findViewById(R.id.balance);
check.setOnClickListener(this);
rlv.setLayoutManager(new LinearLayoutManager(this));
DividerItemDecoration dividerItemDecoration=new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
dividerItemDecoration.setDrawable(ContextCompat.getDrawable(this,R.drawable.line_shape));
rlv.addItemDecoration(dividerItemDecoration);
showpresenter = new Showpresenter(this);
showpresenter.show();
}
@Override
public void view(ArrayList<Data> result) {
Log.i("xxxx",result.toString());
adapter= new MyAdapter(MainActivity.this, result, new MyAdapter.onCheckListener() {
@Override
public void onCheck(boolean isCheck) {
check.setChecked(isCheck);
}
});
rlv.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId())
{
case R.id.check:
if (((CheckBox) v).isChecked())
{
adapter.notifiCheckData(true);
}else
{
adapter.notifiCheckData(false);
}
break;
}
}
}
1. MVP P层
package com.bw.shopping.presenter;
import android.util.Log;
import com.bw.shopping.bean.Data;
import com.bw.shopping.model.ShowModel;
import com.bw.shopping.view.ShowView;
import java.util.ArrayList;
public class Showpresenter {
private final ShowModel model;
private final ShowView showView;
public Showpresenter(ShowView view) {
model = new ShowModel();
showView = view;
}
public void show() {
model.showData();
model.setOnShowClickListener(new ShowModel.onShowClickListener() {
@Override
public void onResult(ArrayList<Data> result) {
Log.i("xx",result.toString());
showView.view(result);
}
});
}
}
1. M层
package com.bw.shopping.model;
import android.os.Handler;
import android.os.Message;
import com.bw.shopping.bean.Data;
import com.bw.shopping.bean.Json;
import com.bw.shopping.utils.ShowUtils;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class ShowModel {
String url="http://172.17.8.100/small/commodity/v1/findCommodityByKeyword?keyword=手机&page=1&count=10";
public interface onShowClickListener
{
void onResult( ArrayList<Data> result);
}
private onShowClickListener onShowClickListener;
public void setOnShowClickListener(ShowModel.onShowClickListener onShowClickListener) {
this.onShowClickListener = onShowClickListener;
}
private Handler handler=new Handler()
{
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what)
{
case 0:
String obj= (String) msg.obj;
Gson gson = new Gson();
Json json = gson.fromJson(obj, Json.class);
ArrayList<Data> result=json.getResult();
onShowClickListener.onResult(result);
break;
}
}
};
public void showData() {
ShowUtils.getinstacne().doGet(url, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String json = response.body().string();
final Message message = new Message();
message.what=0;
message.obj=json;
handler.sendMessage(message);
}
});
}
}
1. 网络请求定义的一个类 然后在M层调用一下
package com.bw.shopping.utils;
import android.util.Log;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.logging.HttpLoggingInterceptor;
public class ShowUtils {
private static ShowUtils showUtils;
private ShowUtils() {
}
public static ShowUtils getinstacne()
{
if (showUtils==null)
{
synchronized (ShowUtils.class)
{
if (showUtils==null)
{
showUtils=new ShowUtils();
}
}
}
return showUtils;
}
public void doGet(String url, Callback callback)
{
HttpLoggingInterceptor httpLoggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i("xxx",message);
}
});
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient=new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.build();
Request request=new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
}
1. 适配器 这个里面有全选
package com.bw.shopping.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bw.shopping.R;
import com.bw.shopping.bean.Data;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
ArrayList<Data> data;
private Map<String,Boolean> map=new HashMap<>();
private String id;
public MyAdapter(Context context, ArrayList<Data> data,onCheckListener onCheckListener) {
this.context = context;
this.data = data;
setCheckData(false);
this.onCheckListener=onCheckListener;
}
private void setCheckData(boolean checkFlag) {
map.clear();
for (int i=0;i<data.size();i++)
{
final Data data = this.data.get(i);
id = data.getCommodityId();
map.put(id,checkFlag);
}
}
public void notifiCheckData(boolean checkFlag)
{
setCheckData(checkFlag);
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item1,null));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
final MyViewHolder myViewHolder= (MyViewHolder) viewHolder;
myViewHolder.item_id1.setText(data.get(i).getCommodityId());
myViewHolder.textView.setText(data.get(i).getCommodityName());
myViewHolder.price.setText("¥"+data.get(i).getPrice());
Glide.with(context).load(data.get(i).getMasterPic()).into(myViewHolder.imageView);
myViewHolder.checkBox.setChecked(map.get(id));
myViewHolder.checkBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final boolean checked = ((CheckBox) v).isChecked();
map.put(id,checked);
boolean isChecked=true;
for (String key : map.keySet())
{
Boolean value=map.get(key);
if (!value)
{
isChecked=false;
if (onCheckListener!=null)
{
onCheckListener.onCheck(isChecked);
}
return;
}
}
if (isChecked)
{
if(onCheckListener!=null)
{
onCheckListener.onCheck(isChecked);
}
}
}
});
}
@Override
public int getItemCount() {
return data.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder
{
private final TextView textView;
private final TextView price;
private final ImageView imageView;
private final CheckBox checkBox;
private final TextView item_id1;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
checkBox = itemView.findViewById(R.id.item_check);
imageView = itemView.findViewById(R.id.item_image1);
price = itemView.findViewById(R.id.item_price);
textView = itemView.findViewById(R.id.item_text1);
item_id1 = itemView.findViewById(R.id.item_id1);
}
}
public interface onCheckListener
{
void onCheck(boolean isCheck);
}
private onCheckListener onCheckListener;
public void setOnCheckListener(MyAdapter.onCheckListener onCheckListener) {
this.onCheckListener = onCheckListener;
}
}