ExpandableListView二级列表购物车

在这里插入图片描述

  1. 购物车只有展示自定义的加减器 没有 其他功能 因为我用的MVP V层我没有写出来 在M层里 写了接口回调 去P层里面回传一下 然后在你写的监听里面设置一下就行 然后直接传到V层里面 具体看代码。

  2. 最外部的布局

在这里插入代码片

		 <?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>							    	    	    	    		
									    	    	    	```
								    	    	
								    	
						

猜你喜欢

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