MainActivity:
import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.CheckBox; import android.widget.TextView; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.util.ArrayList; import java.util.List; import bwie.com.day_shoping_yiji.adpader.RecyclerviewAdpader; import bwie.com.day_shoping_yiji.bean.Shoping_bean; import bwie.com.day_shoping_yiji.presenter.Presenter; import bwie.com.day_shoping_yiji.view.IView; public class MainActivity extends AppCompatActivity implements IView, View.OnClickListener { private RecyclerView recy; // private List<Shoping_bean.DataBean> list=new ArrayList<>(); private List<Shoping_bean.DataBean.DatasBean> list=new ArrayList<>(); private CheckBox che; private TextView pricer; private TextView count; private RecyclerviewAdpader recyclerviewAdpader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //注册 EventBus.getDefault().register(this); //查找控件 initview(); Presenter presenter = new Presenter(); presenter.attachView(this); presenter.post(); } private void initview() { recy = (RecyclerView) findViewById(R.id.recy); che = (CheckBox)findViewById(R.id.che); //设置点击事件 che.setOnClickListener(this); pricer = (TextView) findViewById(R.id.pricer); count = (TextView) findViewById(R.id.count); } @Override public void success(List<Shoping_bean.DataBean.DatasBean> news) { if (news!=null){ list.addAll(news); } //线性布局管理器 LinearLayoutManager manager = new LinearLayoutManager(this); recy.setLayoutManager(manager); //适配器 recyclerviewAdpader = new RecyclerviewAdpader(MainActivity.this,list); recy.setAdapter(recyclerviewAdpader); } @Override public void failes(Exception e) { } //改变全选状态 @Subscribe public void onMessageEvent(MessageEvent event){ che.setChecked(event.isCheck()); } //接收P层传递过来的值 @Subscribe public void onMessageEvent(CounPrice cp){ //把接收过来的值赋值给当前控件 count.setText("数量("+cp.getCount()+")"); pricer.setText("总价:"+cp.getPrice()+"元"); } @Override protected void onDestroy() { super.onDestroy(); //销毁 EventBus.getDefault().unregister(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.che: //点击全选改变所有一级的checkbox状态 recyclerviewAdpader.UpdateAllCheck(che.isChecked()); break; } } }
适配器类: 主要的判断都在此处接下来就是需要自己写的相当于封装的对象类: 这俩个类在计算的时候需要用到import android.content.Context; import android.support.v7.widget.RecyclerView; 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 android.widget.Toast; import org.greenrobot.eventbus.EventBus; import java.util.List; import bwie.com.day_shoping_yiji.CounPrice; import bwie.com.day_shoping_yiji.MessageEvent; import bwie.com.day_shoping_yiji.R; import bwie.com.day_shoping_yiji.bean.Shoping_bean; /** * Created by 迷人的脚毛!! on 2017/11/22. */ public class RecyclerviewAdpader extends RecyclerView.Adapter<RecyclerviewAdpader.ViewHolder> { private Context context; private List<Shoping_bean.DataBean.DatasBean> list; public RecyclerviewAdpader(Context context, List<Shoping_bean.DataBean.DatasBean> list) { this.context = context; this.list = list; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = View.inflate(context, R.layout.recy_view, null); ViewHolder viewHolder = new ViewHolder(v); return viewHolder; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { holder.title.setText(list.get(position).getType_name()); holder.price.setText(list.get(position).getPrice()+""); holder.box.setChecked(list.get(position).isCheck()); final Shoping_bean.DataBean.DatasBean datasBean = list.get(position); //给控件赋值 holder.num.setText( datasBean.getNum()+""); //对checkbox进行点击事件 holder.box.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(context,"点击了!!!",Toast.LENGTH_SHORT).show(); datasBean.setCheck(holder.box.isChecked()); //计算勾选状态下的数量和价格 EventBus.getDefault().post(getCountPrice()); //通过判断子条目的checkbox是否全部选中,来改变全选状态 UpadteAllQX(isCheckAll()); notifyDataSetChanged(); } }); //加的点击事件 holder.jia.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取到当前的数量值 int num = datasBean.getNum(); ++num; //设置给当前的值 datasBean.setNum(num); //设置给控件值 holder.num.setText(num+""); if (holder.box.isChecked()){ EventBus.getDefault().post(getCountPrice()); } notifyDataSetChanged(); } }); //减的点击事件 holder.jian.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //获取当前数量值 int num = datasBean.getNum(); //如果等于1 就返回 if (num==1){ return; } --num; //设置当前的值 datasBean.setNum(num); //把值赋值给控件 holder.num.setText(num+""); //进行计算 if (holder.box.isChecked()){ EventBus.getDefault().post(getCountPrice()); } notifyDataSetChanged(); } }); //点击删除事件 holder.del.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //删除集合中的 list.remove(position); //点击删除的时候同时计算选中的checkbox的钱和数量 if (holder.box.isChecked()){ EventBus.getDefault().post(getCountPrice()); } //刷新适配器 notifyDataSetChanged(); } }); } @Override public int getItemCount() { return list.size(); } class ViewHolder extends RecyclerView.ViewHolder{ private CheckBox box; private TextView title,price,num; private ImageView jian,jia; private Button del; public ViewHolder(View itemView) { super(itemView); box=(CheckBox)itemView.findViewById(R.id.check); title=(TextView)itemView.findViewById(R.id.title); price=(TextView)itemView.findViewById(R.id.price); jian=(ImageView)itemView.findViewById(R.id.jian); jia=(ImageView)itemView.findViewById(R.id.jia); num=(TextView)itemView.findViewById(R.id.num); del=(Button)itemView.findViewById(R.id.del); } } //判断子条目checkbox是否全部选中 private boolean isCheckAll(){ for (int i=0; i<list.size();i++){ Shoping_bean.DataBean.DatasBean datasBean = list.get(i); if (!datasBean.isCheck()){ return false; } } return true; } //改变全选状态 private void UpadteAllQX(boolean flag){ MessageEvent messageEvent = new MessageEvent(); messageEvent.setCheck(flag); EventBus.getDefault().post(messageEvent); } //计算勾选状态下的数量和价格 private CounPrice getCountPrice(){ int count=0; int price=0; for (int i=0; i< list.size(); i++){ Shoping_bean.DataBean.DatasBean datasBean = list.get(i); if (datasBean.isCheck()){ count+=datasBean.getNum(); price+=datasBean.getPrice()*datasBean.getNum(); } } CounPrice counPrice = new CounPrice(); counPrice.setCount(count); counPrice.setPrice(price); return counPrice; } //全选时改变所有的Checkbox都为选中的状态 public void UpdateAllCheck(boolean flag){ for (int i=0; i<list.size();i++){ Shoping_bean.DataBean.DatasBean datasBean = list.get(i); datasBean.setCheck(flag); } //当改变的时候进行计算 EventBus.getDefault().post(getCountPrice()); notifyDataSetChanged(); } }
================================================================public class MessageEvent { private boolean check; public boolean isCheck() { return check; } public void setCheck(boolean check) { this.check = check; } }
public class CounPrice { private int price; private int count; public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } }
其他类就不一一写了 ,就是普通的MVP模式进行解析的,唯一要主要的是在封装json数据bean类中要对数量给个初始值1 如图:
这样在进行加,减 的时候才可以进行正常运行
此代码里面用到一个EventBus :
Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
ThreadMode 定义函数在何种线程中执行
简单点来说就是:应用程序内各组件间、组件与后台线程间的通信
EventBus产生需求背景:
在做项目的时候往往需要应用程序内各组件间、组件与后台线程间的通信。比如耗时操作,等耗时操作完成后通过Handler或Broadcast将结果通知给UI,N个Activity之间需要通过Listener通信,之前的实现方式我们在Android消息传递之组件间传递消息(二)中已经介绍过了,其实这些都可以通过EventBus轻松实现,EventBus通过发布/订阅(publish/subscribe)方式来管理事件总线。其实EventBus的实现方式更加接近上篇文章的方式二,不同的是EventBus通过注解和反射机制 将订阅者连同订阅函数保存起来,然后在发送订阅的时候 遍历订阅函数数组进行调用,其实从这方面就可以EventBus执行效率多少会受到一点影响。
接下来写个布局把 :
主xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="bwie.com.day_shoping_yiji.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="购物车"
android:id="@+id/textView"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true" />
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/recy"
android:layout_below="@+id/textView"
android:layout_above="@+id/linearLayout"></android.support.v7.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/linearLayout"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true">
<CheckBox
android:id="@+id/che"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="全选" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="总价:"
android:layout_weight="1"
android:id="@+id/pricer"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结算"
android:layout_weight="1"
android:id="@+id/count"
/>
</LinearLayout>
</RelativeLayout>
适配器布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/check"
/>
<LinearLayout
android:layout_width="100dp"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:layout_marginTop="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/title"
/>
<TextView
android:layout_marginTop="10dp"
android:textColor="#f00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/price"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/jian"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/shopcart_minus_grey" />
<TextView
android:id="@+id/num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:background="@drawable/shopcart_add_btn"
android:paddingBottom="2dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
android:paddingTop="2dp"
android:text="1"
/>
<ImageView
android:id="@+id/jia"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="5dp"
android:src="@drawable/shopcart_add_red" />
<Button
android:id="@+id/del"
android:text="删除"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>