Adapter
public class MyBigAdapter extends RecyclerView.Adapter<MyBigAdapter.Holder> {
private Context mContext;
private List<MyData.ResultBean> mList;
public MyBigAdapter(Context mContext, List<MyData.ResultBean> mList) {
this.mContext = mContext;
this.mList = mList;
}
@NonNull
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recy_big, null);
Holder holder = new Holder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull Holder holder, final int i) {
holder.mBigTv.setText(mList.get(i).getCategoryName() + "");
SmallAdapter adapter = new SmallAdapter(mList.get(i).getShoppingCartList(), i);
holder.mSamllRecy.setAdapter(adapter);
holder.mBigCheck.setChecked(setBigCheck(i));
holder.mBigCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callback != null) {
callback.bigCheckClick(i);
}
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
public class Holder extends RecyclerView.ViewHolder {
private CheckBox mBigCheck;
private TextView mBigTv;
private RecyclerView mSamllRecy;
public Holder(@NonNull View itemView) {
super(itemView);
mBigCheck = itemView.findViewById(R.id.Big_CheckBox);
mBigTv = itemView.findViewById(R.id.Big_Text);
mSamllRecy = itemView.findViewById(R.id.small_Recy);
mSamllRecy.setLayoutManager(new LinearLayoutManager(mContext));
}
}
//具体商品的适配器
class SmallAdapter extends RecyclerView.Adapter<SmallAdapter.SamllHolder> {
private List<MyData.ResultBean.ShoppingCartListBean> mList;
private int bigIndex;
public SmallAdapter(List<MyData.ResultBean.ShoppingCartListBean> list, int bigIndex) {
this.mList = list;
this.bigIndex = bigIndex;
}
@NonNull
@Override
public SamllHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = View.inflate(mContext, R.layout.recy_samll, null);
SamllHolder holder = new SamllHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull SamllHolder samllHolder, final int i) {
samllHolder.mPrice.setText(mList.get(i).getPrice() + "");
Glide.with(mContext).load(mList.get(i).getPic()).into(samllHolder.mImage);
samllHolder.mSmallName.setText(mList.get(i).getCommodityName() + "");
samllHolder.myAddOrRemoveView.setNumber(mList.get(i).getCount());
samllHolder.mSmallCheck.setChecked(mList.get(i).isStatus());
samllHolder.mSmallCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callback != null) {
callback.smallCheckClick(bigIndex, i);
}
}
});
samllHolder.myAddOrRemoveView.setItemCount(new MyAddOrRemoveView.ItemCount() {
@Override
public void setItemCount(int number) {
if (callback!=null){
callback.smallCheckClickCount(bigIndex,i,number);
}
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
public class SamllHolder extends RecyclerView.ViewHolder {
private CheckBox mSmallCheck;
private TextView mSmallName, mPrice;
private ImageView mImage;
private MyAddOrRemoveView myAddOrRemoveView;
public SamllHolder(@NonNull View itemView) {
super(itemView);
mSmallCheck = itemView.findViewById(R.id.small_Check);
mSmallName = itemView.findViewById(R.id.small_Name);
mPrice = itemView.findViewById(R.id.small_Price);
mImage = itemView.findViewById(R.id.samll_Image);
myAddOrRemoveView = itemView.findViewById(R.id.AddOrRemove);
}
}
}
public interface ShoppingCallback {
void bigCheckClick(int bigIndex);
void smallCheckClick(int bigIndex, int smallIndex);
void smallCheckClickCount(int bigIndex, int smallIndex, int number);
}
private ShoppingCallback callback;
public void setCallback(ShoppingCallback callback) {
this.callback = callback;
}
//接下来就是业务逻辑方法的时候了
//判断商家是否要选中
public boolean setBigCheck(int bigIndex) {
boolean flag = true;
MyData.ResultBean resultBean = mList.get(bigIndex);
for (int i = 0; i < resultBean.getShoppingCartList().size(); i++) {
if (!resultBean.getShoppingCartList().get(i).isStatus()) {
flag = false;
return flag;
}
}
return flag;
}
//当我点击商家的复选框的时候
public void setBigCheckStatus(int bigIndex, boolean isStatus) {
List<MyData.ResultBean.ShoppingCartListBean> cartList = mList.get(bigIndex).getShoppingCartList();
for (MyData.ResultBean.ShoppingCartListBean cardBean : cartList) {
cardBean.setStatus(isStatus);
}
}
//当我点击商品让他选中
public void setSmallCheck(int bigIndex, int smallIndex, boolean isCheck) {
mList.get(bigIndex).getShoppingCartList().get(smallIndex).setStatus(isCheck);
}
//当我点击Activity中的全选按钮式
public boolean isAllChecked() {
boolean isAllchecked = true;
for (int i = 0; i < mList.size(); i++) {
List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
for (int j = 0; j < shoppingCartList.size(); j++) {
if (!shoppingCartList.get(j).isStatus()) {
isAllchecked = false;
return isAllchecked;
}
}
}
return isAllchecked;
}
public void setAllChecked(boolean isCheck) {
for (int i = 0; i < mList.size(); i++) {
List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
for (int j = 0; j < shoppingCartList.size(); j++) {
shoppingCartList.get(j).setStatus(isCheck);
}
}
}
//计算总价格
public int allPrice() {
int allprice = 0;
for (int i = 0; i < mList.size(); i++) {
List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
for (int j = 0; j < shoppingCartList.size(); j++) {
if (shoppingCartList.get(j).isStatus()) {
allprice += shoppingCartList.get(j).getPrice() * shoppingCartList.get(j).getCount();
}
}
}
return allprice;
}
//计算总数量
public int allNumber() {
int count = 0;
for (int i = 0; i < mList.size(); i++) {
List<MyData.ResultBean.ShoppingCartListBean> shoppingCartList = mList.get(i).getShoppingCartList();
for (int j = 0; j < shoppingCartList.size(); j++) {
if (shoppingCartList.get(j).isStatus()) {
count += shoppingCartList.get(j).getCount();
}
}
}
return count;
}
}
Api
public interface ApiService {
@GET
Observable<ResponseBody> getInfoNoParams(@Url String url);
@GET
Observable<ResponseBody> getInfoParams(@Url String url, @QueryMap Map<String, Object> map);
@GET
Observable<ResponseBody> getHeadrInfo(@Url String url, @HeaderMap Map<String, Object> map);
}
BaseActivity
public abstract class BaseActivity<P extends BasePresenter> extends AppCompatActivity implements IContract.IView,View.OnClickListener {
public P mPresenter;
public EventBus eventBus;
private Unbinder bind;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getLayoutId() != 0) {
setContentView(getLayoutId());
bind = ButterKnife.bind(this);
eventBus = EventBus.getDefault();
initViews();
mPresenter = getPresenter();
if (mPresenter != null) {
mPresenter.onAttch(this);
startCoding();
}
}
}
//EventBus那个页面想用那个页面调用这个方法就行
public void registerEventbus() {
eventBus.register(this);
}
public abstract P getPresenter();
public abstract int getLayoutId();
public abstract void initViews();
public abstract void startCoding();
@Override
protected void onDestroy() {
super.onDestroy();
mPresenter.onDeAttch();
mPresenter = null;
if (eventBus.isRegistered(this)) {
eventBus.unregister(this);
}
if (bind != null) {
bind.unbind();
}
}
}
BasePresenter
public abstract class BasePresenter<V extends IContract.IView> implements IContract.IPresenter{
private WeakReference<V> mWeakReference;
public BasePresenter() {
initModel();
}
public abstract void initModel();
public void onAttch(V v) {
mWeakReference = new WeakReference<>(v);
}
public void onDeAttch() {
if (mWeakReference != null) {
mWeakReference.clear();
mWeakReference = null;
}
}
public V getV() {
return mWeakReference.get();
}
}
Contract
public interface IContract {
interface IModel {
//没有参数的时候
void doGetNoParams(String url, Class cls, ModelCallback callback);
void doGetParams(String url, Class cls, Map<String, Object> map, ModelCallback callback);
void doPostParams(String url, Class cls, Map<String, Object> map, ModelCallback callback);
}
interface IView<T> {
void onSuccess(T t);
void onError(String error);
}
interface IPresenter {
void startGetNoParamsRequest(String url, Class cls);
void startGetRequest(String url, Class cls, Map<String, Object> map);
void doPostParams(String url, Class cls, Map<String, Object> map, ModelCallback callback);
}
interface ModelCallback<T> {
void onSuccess(T t);
void onError(String error);
}
}
Model
public class ModelImpl implements IContract.IModel {
//无参数的Get请求
@Override
public void doGetNoParams(String url, Class cls, final IContract.ModelCallback callback) {
NetUtils.getInstance().getInfo(url, cls, new NetUtils.NetCallback() {
@Override
public void onSuccess(Object o) {
callback.onSuccess(o);
}
@Override
public void onError(String str) {
callback.onError(str);
}
});
}
@Override
public void doGetParams(String url, Class cls, Map<String, Object> map, final IContract.ModelCallback callback) {
NetUtils.getInstance().getHeaderInfo(url, map, cls, new NetUtils.NetCallback() {
@Override
public void onSuccess(Object o) {
callback.onSuccess(o);
}
@Override
public void onError(String str) {
callback.onError(str);
}
});
}
@Override
public void doPostParams(String url, Class cls, Map<String, Object> map, IContract.ModelCallback callback) {
}
}
Presenter
public class PresenterImpl extends BasePresenter {
private ModelImpl model;
@Override
public void initModel() {
model = new ModelImpl();
}
@Override
public void startGetNoParamsRequest(String url, Class cls) {
model.doGetNoParams(url, cls, new IContract.ModelCallback() {
@Override
public void onSuccess(Object o) {
getV().onSuccess(o);
}
@Override
public void onError(String error) {
getV().onError(error);
}
});
}
@Override
public void startGetRequest(String url, Class cls, Map<String, Object> map) {
model.doGetParams(url, cls, map, new IContract.ModelCallback() {
@Override
public void onSuccess(Object o) {
getV().onSuccess(o);
}
@Override
public void onError(String error) {
getV().onSuccess(error);
}
});
}
@Override
public void doPostParams(String url, Class cls, Map<String, Object> map, IContract.ModelCallback callback) {
}
}
Url
public interface MyUrls {
String BASEURL = "http://172.17.8.100/small/";
//banner接口
String BANNER = "commodity/v1/bannerShow";
//首页接口
String HOMEPAGE = "commodity/v1/commodityList";
//二级购物车
String SHOPPINGCARD = "order/verify/v1/findShoppingCart";
}
Utils
public class NetUtils {
private ApiService apiService;
private NetUtils() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.addInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(MyUrls.BASEURL)
.client(okHttpClient)
//结合Rxjava使用
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//结合Gson使用
.addConverterFactory(GsonConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
}
private static class NetHolder {
private static final NetUtils netUtils = new NetUtils();
}
public static NetUtils getInstance() {
return NetHolder.netUtils;
}
//没有请求头参数
public void getInfo(String url, final Class cls, final NetCallback callback) {
apiService.getInfoNoParams(url).subscribeOn(Schedulers.io())//被观察者在什么线程上工作
.observeOn(AndroidSchedulers.mainThread())//观察者相应一般都是在主线程
.subscribe(new Observer<ResponseBody>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(ResponseBody responseBody) {
Gson gson = new Gson();
try {
Object object = gson.fromJson(responseBody.string(), cls);
if (callback != null) {
callback.onSuccess(object);
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
if (callback != null) {
callback.onError(e.getMessage());
}
}
@Override
public void onComplete() {
}
});
}
//有请求头参数的
public void getHeaderInfo(String url, Map<String, Object> map, final Class cls, final NetCallback callback) {
apiService.getHeadrInfo(url, map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(ResponseBody responseBody) throws Exception {
if (callback != null) {
Gson gson = new Gson();
Object obj = gson.fromJson(responseBody.string(), cls);
callback.onSuccess(obj);
}
}
});
}
public interface NetCallback<T> {
void onSuccess(T t);
void onError(String str);
}
}
AddRemove
public class MyAddOrRemoveView extends LinearLayout implements View.OnClickListener {
private TextView mAdd, mNumber, mRemove;
public MyAddOrRemoveView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.add_remove_layout, this);
initViews();
}
public void setNumber(int number) {
mNumber.setText(number + "");
}
private void initViews() {
mAdd = findViewById(R.id.Add);
mNumber = findViewById(R.id.Number);
mRemove = findViewById(R.id.Remove);
mAdd.setOnClickListener(this);
mRemove.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int count = Integer.parseInt(mNumber.getText().toString());
switch (v.getId()) {
case R.id.Add:
count++;
mNumber.setText(count + "");
if (itemCount != null) {
itemCount.setItemCount(count);
}
break;
case R.id.Remove:
if (count > 1) {
count--;
mNumber.setText(count + "");
if (itemCount != null) {
itemCount.setItemCount(count);
}
} else {
Toast.makeText(getContext(), "数量最少为1", Toast.LENGTH_SHORT).show();
}
break;
}
}
public interface ItemCount {
void setItemCount(int number);
}
private ItemCount itemCount;
public void setItemCount(ItemCount itemCount) {
this.itemCount = itemCount;
}
}
MianActivity
public class MainActivity extends BaseActivity {
@BindView(R.id.recy_View)
RecyclerView mRecy;
private List<MyData.ResultBean> mList = new ArrayList<>();
private MyBigAdapter mAdapter;
@BindView(R.id.All_check)
CheckBox All_check;
@BindView(R.id.All_Price)
TextView All_Price;
@BindView(R.id.All_Count)
TextView All_Count;
@Override
public BasePresenter getPresenter() {
return new PresenterImpl();
}
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void initViews() {
All_check.setOnClickListener(this);
mRecy.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public void startCoding() {
mAdapter = new MyBigAdapter(this, mList);
mRecy.setAdapter(mAdapter);
Map<String, Object> map = new HashMap<>();
map.put("userId", "10922");
map.put("sessionId", "157559325456410922");
mPresenter.startGetRequest(MyUrls.SHOPPINGCARD, MyData.class, map);
mAdapter.setCallback(new MyBigAdapter.ShoppingCallback() {
@Override
public void bigCheckClick(int bigIndex) {
boolean b = mAdapter.setBigCheck(bigIndex);
mAdapter.setBigCheckStatus(bigIndex, !b);
mAdapter.notifyDataSetChanged();
allCalculation();
}
@Override
public void smallCheckClick(int bigIndex, int smallIndex) {
boolean status = mList.get(bigIndex).getShoppingCartList().get(smallIndex).isStatus();
mAdapter.setSmallCheck(bigIndex, smallIndex, !status);
mAdapter.notifyDataSetChanged();
allCalculation();
}
@Override
public void smallCheckClickCount(int bigIndex, int smallIndex, int number) {
mList.get(bigIndex).getShoppingCartList().get(smallIndex).setCount(number);
mAdapter.notifyDataSetChanged();
allCalculation();
}
});
}
@Override
public void onSuccess(Object o) {
if (o instanceof MyData) {
mList.addAll(((MyData) o).getResult());
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onError(String error) {
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.All_check:
boolean allChecked = mAdapter.isAllChecked();
mAdapter.setAllChecked(!allChecked);
All_check.setChecked(!allChecked);
mAdapter.notifyDataSetChanged();
All_Count.setText("总数量:" + mAdapter.allNumber());
All_Price.setText("总价格:" + mAdapter.allPrice());
break;
}
}
private void allCalculation() {
boolean allChecked = mAdapter.isAllChecked();
All_check.setChecked(allChecked);
All_Count.setText("总数量:" + mAdapter.allNumber());
All_Price.setText("总价格:" + mAdapter.allPrice());
}
}
activity.xml
public class MainActivity extends BaseActivity {
@BindView(R.id.recy_View)
RecyclerView mRecy;
private List<MyData.ResultBean> mList = new ArrayList<>();
private MyBigAdapter mAdapter;
@BindView(R.id.All_check)
CheckBox All_check;
@BindView(R.id.All_Price)
TextView All_Price;
@BindView(R.id.All_Count)
TextView All_Count;
@Override
public BasePresenter getPresenter() {
return new PresenterImpl();
}
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
@Override
public void initViews() {
All_check.setOnClickListener(this);
mRecy.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public void startCoding() {
mAdapter = new MyBigAdapter(this, mList);
mRecy.setAdapter(mAdapter);
Map<String, Object> map = new HashMap<>();
map.put("userId", "10922");
map.put("sessionId", "157559325456410922");
mPresenter.startGetRequest(MyUrls.SHOPPINGCARD, MyData.class, map);
mAdapter.setCallback(new MyBigAdapter.ShoppingCallback() {
@Override
public void bigCheckClick(int bigIndex) {
boolean b = mAdapter.setBigCheck(bigIndex);
mAdapter.setBigCheckStatus(bigIndex, !b);
mAdapter.notifyDataSetChanged();
allCalculation();
}
@Override
public void smallCheckClick(int bigIndex, int smallIndex) {
boolean status = mList.get(bigIndex).getShoppingCartList().get(smallIndex).isStatus();
mAdapter.setSmallCheck(bigIndex, smallIndex, !status);
mAdapter.notifyDataSetChanged();
allCalculation();
}
@Override
public void smallCheckClickCount(int bigIndex, int smallIndex, int number) {
mList.get(bigIndex).getShoppingCartList().get(smallIndex).setCount(number);
mAdapter.notifyDataSetChanged();
allCalculation();
}
});
}
@Override
public void onSuccess(Object o) {
if (o instanceof MyData) {
mList.addAll(((MyData) o).getResult());
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onError(String error) {
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.All_check:
boolean allChecked = mAdapter.isAllChecked();
mAdapter.setAllChecked(!allChecked);
All_check.setChecked(!allChecked);
mAdapter.notifyDataSetChanged();
All_Count.setText("总数量:" + mAdapter.allNumber());
All_Price.setText("总价格:" + mAdapter.allPrice());
break;
}
}
private void allCalculation() {
boolean allChecked = mAdapter.isAllChecked();
All_check.setChecked(allChecked);
All_Count.setText("总数量:" + mAdapter.allNumber());
All_Price.setText("总价格:" + mAdapter.allPrice());
}
}
addremove.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:id="@+id/Add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="➕" />
<TextView
android:id="@+id/Number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="10" />
<TextView
android:id="@+id/Remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="➖" />
</LinearLayout>
recybig
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/Big_CheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/Big_Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/small_Recy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>
</LinearLayout>
recysmall.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<CheckBox
android:id="@+id/small_Check"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/samll_Image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/small_Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="nike内裤" />
<TextView
android:id="@+id/small_Price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="38.9" />
<soexample.umeng.com.day07_shopping_car_demo.weight.MyAddOrRemoveView
android:id="@+id/AddOrRemove"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>