public class HomeActivity extends BaseActivity<HomePresenter> implements HomeContract.View {
@BindView(R.id.tb_head)
Toolbar tbHead;
@BindView(R.id.rv_cotainner)
RecyclerView rvCotainner;
@BindView(R.id.cb_All)
CheckBox cbAll;
@BindView(R.id.tv_total)
TextView tvTotal;
@BindView(R.id.btn_confirm)
Button btnConfirm;
private OutterBean outterBean;
private OutterAdapter outterAdapter;
@Override
public void setupActivityComponent(@NonNull AppComponent appComponent) {
DaggerHomeComponent //如找不到该类,请编译一下项目
.builder()
.appComponent(appComponent)
.homeModule(new HomeModule(this))
.build()
.inject(this);
}
@Override
public int initView(@Nullable Bundle savedInstanceState) {
return R.layout.activity_home; //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
}
@Override
public void initData(@Nullable Bundle savedInstanceState) {
//请求商品列表
mPresenter.requestCarts();
}
@Override
public void showLoading() {
}
@Override
public void hideLoading() {
}
@Override
public void showMessage(@NonNull String message) {
checkNotNull(message);
ArmsUtils.snackbarText(message);
}
@Override
public void launchActivity(@NonNull Intent intent) {
checkNotNull(intent);
ArmsUtils.startActivity(intent);
}
@Override
public void killMyself() {
finish();
}
/**
* 使用接口回调将第一个adapter的商品选择的监听事件回调给MainActivity。
*
* 使用接口回调将第二个adapter的商品选择的监听事件回调给第一个adapter后再在第一个adapter中回调给MainActivity。
*
* 在MainActivity中处理第一个adapter和第二个adapter的事件监听。
*
* @param responseInfo
*/
@Override
public void showCarts(String responseInfo) {
Gson gson = new Gson();
outterBean = gson.fromJson(responseInfo, OutterBean.class);
List<OutterBean.DataBean> dataBeanList = outterBean.getData();
//设置外层RecyclerView
LinearLayoutManager manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
outterAdapter = new OutterAdapter(R.layout.container_view, dataBeanList);
rvCotainner.setLayoutManager(manager);
rvCotainner.setAdapter(outterAdapter);
//对适配器回调的内容进行监听
outterAdapter.setOnCheckedChangeLisenter(new OutterAdapter.OnCheckedChangeLisenter() {
@Override
public void onChecked(int layoutPosition, boolean isChecked) {
//全选条目的标识
boolean isAllChecked = true;
//外层条目的判断
for (int i = 0; i < outterBean.getData().size(); i++) {
boolean ischecked = outterBean.getData().get(i).getOutterChecked();
//内层条目的判断
for (int j = 0; j < outterBean.getData().get(i).getList().size(); j++) {
boolean isItemchecked = outterBean.getData().get(i).getList().get(j).getInnerChecked();
isAllChecked = (isAllChecked & ischecked & isItemchecked);
}
}
cbAll.setChecked(isAllChecked);
//外层条目
//outterBean.getData().get(layoutPosition).setOutterChecked(isChecked);
//刷新总体适配器
outterAdapter.notifyDataSetChanged();
}
@Override
public void onOutterItemChecked(int layoutPosition, boolean checked) {
outterBean.getData().get(layoutPosition).setOutterChecked(checked);
//全选条目的标识
boolean isAllChecked = true;
//外层条目的判断
for (int i = 0; i < outterBean.getData().size(); i++) {
boolean ischecked = outterBean.getData().get(i).getOutterChecked();
//内层条目的判断
for (int j = 0; j < outterBean.getData().get(i).getList().size(); j++) {
boolean isItemchecked = outterBean.getData().get(i).getList().get(j).getInnerChecked();
isAllChecked = (isAllChecked & ischecked & isItemchecked);
}
}
cbAll.setChecked(isAllChecked);
//外层条目
//outterBean.getData().get(layoutPosition).setOutterChecked(isChecked);
//刷新总体适配器
outterAdapter.notifyDataSetChanged();
}
});
}
@OnClick({R.id.cb_All, R.id.btn_confirm})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.cb_All:
if (cbAll.isChecked()) {
//如果全选被选中,最外层的是否选中的状态手动更改为true,刷新适配器
for (int i = 0; i < outterBean.getData().size(); i++) {
outterBean.getData().get(i).setOutterChecked(true);
for (int j = 0; j < outterBean.getData().get(i).getList().size(); j++) {
outterBean.getData().get(i).getList().get(j).setInnerChecked(true);
}
}
} else {
//如果全选未被选中,最外层的是否选中的状态手动更改为false,刷新适配器
for (int i = 0; i < outterBean.getData().size(); i++) {
outterBean.getData().get(i).setOutterChecked(false);
for (int j = 0; j < outterBean.getData().get(i).getList().size(); j++) {
outterBean.getData().get(i).getList().get(j).setInnerChecked(false);
}
}
}
outterAdapter.notifyDataSetChanged();
break;
case R.id.btn_confirm:
break;
}
}
}
public class InnerAdapter extends BaseQuickAdapter<OutterBean.DataBean.ListBean, BaseViewHolder> {
public InnerAdapter(int layoutResId, @Nullable List<OutterBean.DataBean.ListBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, OutterBean.DataBean.ListBean item) {
helper.setText(R.id.tv_showInfo, "¥" + item.getPrice());
SimpleDraweeView iv_showIcon = helper.getView(R.id.iv_showIcon);
//根据|进行切割
String images = item.getImages();
String[] splitImages = images.split("\\|");
//Fresco加载图片
Uri uri = Uri.parse(splitImages[0]);
iv_showIcon.setImageURI(uri);
//从Bean对象去取出勾选状态
Log.e("getInnerChecked", "item.getInnerChecked():" + item.getInnerChecked());
helper.setChecked(R.id.cb_innerChecked, item.getInnerChecked());
CheckBox cb_innerChecked = helper.getView(R.id.cb_innerChecked);
cb_innerChecked.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//内层的状态更改完
item.setInnerChecked(cb_innerChecked.isChecked());
//通过接口回调,把状态回显给外层
onCheckedChangeLisenter.onChecked(helper.getLayoutPosition(),cb_innerChecked.isChecked());
}
});
/* cb_innerChecked.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//内层的状态更改完
item.setInnerChecked(cb_innerChecked.isChecked());
//通过接口回调,把状态回显给外层
onCheckedChangeLisenter.onChecked(helper.getLayoutPosition(),isChecked);
}
});*/
}
public interface OnCheckedChangeLisenter {
void onChecked(int layoutPosition, boolean isChecked);
}
public void setOnCheckedChangeLisenter(OnCheckedChangeLisenter onCheckedChangeLisenter) {
this.onCheckedChangeLisenter = onCheckedChangeLisenter;
}
OnCheckedChangeLisenter onCheckedChangeLisenter;
}
public class OutterAdapter extends BaseQuickAdapter<OutterBean.DataBean, BaseViewHolder> {
private List<OutterBean.DataBean.ListBean> listBeans;
private CheckBox cb_outter_chose;
private InnerAdapter innerAdapter;
private int layoutPosition;
public interface OnCheckedChangeLisenter {
void onChecked(int layoutPosition, boolean isChecked);
void onOutterItemChecked(int layoutPosition, boolean checked);
}
public void setOnCheckedChangeLisenter(OnCheckedChangeLisenter onCheckedChangeLisenter) {
this.onCheckedChangeLisenter = onCheckedChangeLisenter;
}
private RecyclerView rv_innerContainer;
OnCheckedChangeLisenter onCheckedChangeLisenter;
public OutterAdapter(int layoutResId, @Nullable List<OutterBean.DataBean> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, OutterBean.DataBean item) {
//当前的位置
layoutPosition = helper.getLayoutPosition();
//外层的条目商家信息内容
helper.setText(R.id.cb_outter_chose, item.getSellerName());
//外层的勾选状态
cb_outter_chose = helper.getView(R.id.cb_outter_chose);
//外层被点击之后及时通过接口回调的形式通知全选/反选按钮
cb_outter_chose.setOnCheckedChangeListener(null);
cb_outter_chose.setChecked(item.getOutterChecked());
cb_outter_chose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
item.setOutterChecked(isChecked);
if (isChecked){
for (int i = 0; i < item.getList().size(); i++) {
item.getList().get(i).setInnerChecked(true);
}
}else {
for (int i = 0; i < item.getList().size(); i++) {
item.getList().get(i).setInnerChecked(false);
}
}
onCheckedChangeLisenter.onOutterItemChecked(helper.getLayoutPosition(),isChecked);
}
});
//外层条目的适配器中需获取内层的RecyclerView
rv_innerContainer = helper.getView(R.id.rv_innerContainer);
//内层的数据源是item.getList();
listBeans = item.getList();
//需要将数据源设置给适配器
innerAdapter = new InnerAdapter(R.layout.inner_recyclerview_item, listBeans);
LinearLayoutManager manager = new LinearLayoutManager(App.getInstance(), LinearLayoutManager.VERTICAL, false);
rv_innerContainer.setLayoutManager(manager);
rv_innerContainer.setAdapter(innerAdapter);
innerAdapter.setOnCheckedChangeLisenter(new InnerAdapter.OnCheckedChangeLisenter() {
@Override
public void onChecked(int layoutPosition, boolean isChecked) {
boolean isAllInnerChecked = true;
for (int i = 0; i < item.getList().size(); i++) {
boolean innerChecked = item.getList().get(i).getInnerChecked();
isAllInnerChecked = (isAllInnerChecked & innerChecked);
}
cb_outter_chose.setChecked(isAllInnerChecked);
//外层条目
item.setOutterChecked(isAllInnerChecked);
//首先需要更改Bean对象的状态,把具体的位置进行回传
//然后通过接口回调通知调用者,状态发送改变,及时对全选/反选按钮做更新处理
onCheckedChangeLisenter.onChecked(layoutPosition, isChecked);
}
});
}
}
public class ToogleButton extends LinearLayout implements View.OnClickListener {
private Button btn_delete;
private Button btn_add;
private TextView tv_num;
public ToogleButton(Context context) {
super(context);
}
public ToogleButton(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//设置的布局
LayoutInflater.from(context).inflate(R.layout.tooglebutton_view, this);
btn_delete = findViewById(R.id.btn_delete);
btn_add = findViewById(R.id.btn_add);
tv_num = findViewById(R.id.tv_num);
btn_add.setOnClickListener(this);
btn_delete.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String numString = tv_num.getText().toString();
int num = Integer.parseInt(numString);
switch (v.getId()) {
case R.id.btn_delete:
num = (num - 1);
if (num < 0) {
Toast.makeText(App.getInstance(), "必须大于等于0", Toast.LENGTH_SHORT).show();
return;
}
tv_num.setText(String.valueOf(num));
break;
case R.id.btn_add:
num = (num + 1);
tv_num.setText(String.valueOf(num));
break;
}
}
}
public class App extends BaseApplication {
private static App app;
@Override
public void onCreate() {
super.onCreate();
app = App.this;
//Fresco初始化
Fresco.initialize(this);
}
public static App getInstance() {
return app;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/border_background"
android:orientation="horizontal">
<Button
android:id="@+id/btn_delete"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@mipmap/delete" />
<TextView
android:id="@+id/tv_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:text="0" />
<Button
android:id="@+id/btn_add"
android:layout_width="30dp"
android:layout_height="30dp"
android:background="@mipmap/add" />
</LinearLayout>