-
购物车只有展示自定义的加减器 没有 其他功能 因为我用的MVP V层我没有写出来 在M层里 写了接口回调 去P层里面回传一下 然后在你写的监听里面设置一下就行 然后直接传到V层里面 具体看代码。
-
最外部的布局
在这里插入代码片
<?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">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="购物车"
android:gravity="center"
android:textSize="30dp"
android:id="@+id/shopping"
android:textColor="@android:color/holo_red_dark"
/>
<ExpandableListView
android:descendantFocusability="blocksDescendants"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/ex"
></ExpandableListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center"
>
<CheckBox
android:id="@+id/checkbox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="全选"
android:textSize="20dp"
android:textColor="@android:color/darker_gray"
android:button="@drawable/shape_image"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="100dp"
android:text="总价:"
android:textSize="20dp"
android:id="@+id/sums"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="结算"
android:layout_alignParentRight="true"
android:background="@android:color/holo_red_dark"
/>
</RelativeLayout>
</LinearLayout>
1. 父条目布局
<?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="horizontal"
>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="100dp"
android:gravity="center"
android:focusable="false"
android:button="@drawable/shape_image"
android:id="@+id/parent_check"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_marginLeft="55dp"
android:text="33"
android:id="@+id/parent_text"
/>
</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="horizontal"
>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center"
android:focusable="false"
android:id="@+id/child_checkbox"
android:button="@drawable/shape_image"
/>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:id="@+id/child_image"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="3333"
android:id="@+id/chilid_name"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/child_price"
android:text="66"
/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="333"
android:id="@+id/chid_time"
/>
<com.bw.erjigouwuche.jjq.JiaJianQi
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_alignParentRight="true"
android:id="@+id/child_jj"
></com.bw.erjigouwuche.jjq.JiaJianQi>
</RelativeLayout>
</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="150dp"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/darker_gray"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<Button
android:id="@+id/left_button"
android:layout_width="25dp"
android:background="#fff"
android:layout_height="wrap_content"
android:text="-"
android:textSize="25sp"
/>
<EditText
android:layout_width="50dp"
android:background="@null"
android:layout_height="match_parent"
android:gravity="center"
android:id="@+id/edit_num"
android:text="1"
/>
<Button
android:id="@+id/right_button"
android:layout_width="25dp"
android:background="#fff"
android:layout_height="wrap_content"
android:text="+"
android:textSize="25sp"
/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
4. Activity
package com.bw.erjigouwuche;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.TextView;
import com.bw.erjigouwuche.adapter.MyAdapter;
import com.bw.erjigouwuche.bean.JsonBean;
import com.bw.erjigouwuche.presenter.ShowPresenter;
import com.bw.erjigouwuche.view.ShowView;
import java.util.List;
public class MainActivity extends AppCompatActivity implements ShowView {
private ExpandableListView expandable;
private CheckBox checkBox;
private TextView sums;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 找控件
initView();
//写数据
initData();
}
private void initView() {
expandable = findViewById(R.id.ex);
checkBox = findViewById(R.id.checkbox1);
sums = findViewById(R.id.sums);
// 去掉箭头
expandable.setGroupIndicator(null);
}
private void initData() {
ShowPresenter presenter=new ShowPresenter(this);
presenter.gouwupresenter();
}
@Override
public void onshowView(List<JsonBean.DataBean> data) {
MyAdapter adapter=new MyAdapter(MainActivity.this,data);
expandable.setAdapter(adapter);
}
}
5. 我用的MVP做的 所以这是p层
package com.bw.erjigouwuche.presenter;
import com.bw.erjigouwuche.bean.JsonBean;
import com.bw.erjigouwuche.model.ShowModel;
import com.bw.erjigouwuche.view.ShowView;
import java.util.List;
public class ShowPresenter {
private final ShowModel model;
private final ShowView showView;
//在构造方法model和View
public ShowPresenter(ShowView view) {
model = new ShowModel();
showView = view;
}
public void gouwupresenter() {
model.gouwuModel();
model.setOnShowClickListener(new ShowModel.onShowClickListener() {
@Override
public void onShowClick(List<JsonBean.DataBean> data) {
showView.onshowView(data);
}
});
}
}
6. 接下来是M层 我在M层里面写的网络请求
package com.bw.erjigouwuche.model;
import android.os.Handler;
import android.os.Message;
import com.bw.erjigouwuche.bean.JsonBean;
import com.bw.erjigouwuche.utils.OkUtils;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.List;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class ShowModel {
String url="http://172.17.8.100/ks/product/getCarts?uid=51";
public interface onShowClickListener
{
void onShowClick(List<JsonBean.DataBean> data);
}
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();
JsonBean jsonBean = gson.fromJson(obj, JsonBean.class);
List<JsonBean.DataBean> data = jsonBean.getData();
onShowClickListener.onShowClick(data);
break;
}
}
};
public void gouwuModel() {
OkUtils.getInstance().doGet(url, null, null, 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);
}
});
}
}
***7. 拦截器还有get和post请求 我在外面定义了一个类 在里面写的网络请求 然后在M层调用的拦截器和网络请求***
package com.bw.erjigouwuche.utils;
import android.util.Log;
import java.io.IOException;
import java.util.Map;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkUtils {
//单例模式
private static OkUtils okUtils;
private OkUtils() {
}
public static OkUtils getInstance()
{
if (okUtils==null)
{
//同步锁
synchronized (OkUtils.class)
{
if (okUtils==null)
{
okUtils=new OkUtils();
}
}
}
return okUtils;
}
public static OkHttpClient okHttpClient;
public synchronized static OkHttpClient getOkHttpClient(String sessionId, String userId)
{
if (okHttpClient==null)
{
//创建日志拦截器
HttpLoggingInterceptor httpLoggingInterceptor=new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i("xxx",message);
}
});
//设置日志拦截器模式
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
//创建ok
okHttpClient=new OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request=chain.request().newBuilder()
.addHeader("source","android")
.build();
return chain.proceed(request);
}
}).build();
}
return okHttpClient;
}
public void doGet(String url, String sessionId, String userId, Callback callback)
{
OkHttpClient okHttpClient=getOkHttpClient(sessionId,userId);
Request request=new Request.Builder()
.url(url)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
public void doPost(String url, String sessionId, String userId, Map<String,String> map, Callback callback)
{
OkHttpClient okHttpClient=getOkHttpClient(sessionId,userId);
FormBody.Builder body =new FormBody.Builder();
for (String key:map.keySet())
{
body.add(key,map.get(key));
}
Request request=new Request.Builder()
.url(url)
.post(body.build())
.build();
okHttpClient.newCall(request).enqueue(callback);
}
}
7. 接下来就是适配器 bean自己写 我用的是GSON解析
package com.bw.erjigouwuche.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bw.erjigouwuche.MainActivity;
import com.bw.erjigouwuche.R;
import com.bw.erjigouwuche.bean.JsonBean;
import com.bw.erjigouwuche.jjq.JiaJianQi;
import java.util.List;
public class MyAdapter extends BaseExpandableListAdapter {
Context context;
List<JsonBean.DataBean> data;
public MyAdapter(Context context, List<JsonBean.DataBean> data) {
this.context = context;
this.data = data;
}
@Override
public int getGroupCount() {
return data.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return data.get(groupPosition).getList().size();
}
@Override
public Object getGroup(int groupPosition) {
return data.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return data.get(groupPosition).getList().get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView==null)
{
convertView = View.inflate(context, R.layout.parent_item, null);
viewHolder=new ViewHolder();
viewHolder.parent_name=convertView.findViewById(R.id.parent_text);
viewHolder.parent_check=convertView.findViewById(R.id.parent_check);
convertView.setTag(viewHolder);
}else
{
viewHolder= (ViewHolder) convertView.getTag();
}
//赋值
viewHolder.parent_name.setText(data.get(groupPosition).getSellerName());
viewHolder.parent_check.setChecked(data.get(groupPosition).isChecked());
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolder2 viewHolder2;
if (convertView==null)
{
convertView = View.inflate(context, R.layout.child_item, null);
viewHolder2=new ViewHolder2();
viewHolder2.child_check=convertView.findViewById(R.id.child_checkbox);
viewHolder2.child_name=convertView.findViewById(R.id.chilid_name);
viewHolder2.child_price=convertView.findViewById(R.id.child_price);
viewHolder2.child_time=convertView.findViewById(R.id.chid_time);
viewHolder2.child_image=convertView.findViewById(R.id.child_image);
viewHolder2.child_jj=convertView.findViewById(R.id.child_jj);
convertView.setTag(viewHolder2);
}else
{
viewHolder2= (ViewHolder2) convertView.getTag();
}
//赋值
viewHolder2.child_name.setText(data.get(groupPosition).getList().get(childPosition).getSubhead());
viewHolder2.child_price.setText("¥:"+data.get(groupPosition).getList().get(childPosition).getPrice());
viewHolder2.child_time.setText(data.get(groupPosition).getList().get(childPosition).getCreatetime());
viewHolder2.child_check.setChecked(data.get(groupPosition).getList().get(childPosition).isItemCheckbox());
Glide.with(context).load(data.get(groupPosition).getList().get(childPosition).getImages()).into(viewHolder2.child_image);
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class ViewHolder
{
TextView parent_name;
CheckBox parent_check;
}
class ViewHolder2
{
TextView child_name;
CheckBox child_check;
TextView child_price;
TextView child_time;
JiaJianQi child_jj;
ImageView child_image;
}
}
8. 还有就是我把CheckBox设置成了圆形 在drawable里面写的 然后在你布局里每个里面调用一下就行
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/checkbox_checked" android:state_checked="true"></item>
<item android:drawable="@mipmap/checkbox_checked" android:state_pressed="true"></item>
<item android:drawable="@mipmap/checkbox_unchecked" ></item>
</selector>
```