RecyclerView购物车+全选

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);
         //CheckBox点击事件
        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);
        //实例化presenter
        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 {
     /**
          * @explain
          * @author 张冰凡.
          * @time 2019/3/5 13:46.
          */

    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;
    }

    //全选控制适配器item
    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);
      //根据id保存状态
        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);
        }
    }
    //定义CheckBox点击的接口回调
    public  interface onCheckListener
    {
        void onCheck(boolean isCheck);
    }
    private onCheckListener onCheckListener;


    public void setOnCheckListener(MyAdapter.onCheckListener onCheckListener) {
        this.onCheckListener = onCheckListener;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44329686/article/details/88343639