仿京东购物车订单页面

该博客主要介绍了如何创建一个类似京东购物车的订单页面,包括页面布局的设计、相关接口的实现以及自定义RecyclerView的分割线。内容涵盖关键接口的详细讲解,旨在帮助读者掌握电商应用开发中的订单展示技术。

//布局

<?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="com.bwie.gouwuche_dingdanyemian.View.MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:gravity="center"
            android:textSize="25sp"
            android:layout_weight="1"
            android:text="订单列表"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:id="@+id/image"
            android:layout_gravity="center_vertical"
            android:src="@mipmap/ic_launcher"
            android:layout_width="30dp"
            android:layout_height="30dp" />
    </LinearLayout>


    <com.jcodecraeer.xrecyclerview.XRecyclerView
        android:id="@+id/xlv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></com.jcodecraeer.xrecyclerview.XRecyclerView>
</LinearLayout>
//View层

//接口

public interface iView {
    //初始化数据的方法
    void ShowDate(List<Dben.DataBean> data);
    //失败的方法
    void Error(String errors);
    //上拉刷新
    void RefreshtoDate(List<Dben.DataBean> data);
    //下拉加载
    void LoadingtoDate(List<Dben.DataBean> data);
    //取消订单
    void quxiaoDate();
}
//实现类 也就是MainActivity

public class MainActivity extends AppCompatActivity implements iView,View.OnClickListener{

    private XRecyclerView xlv;
    private ImageView image;
    int page=0;
    private iPresenterImpl p;
    List<Dben.DataBean> data;
    private String[] item = new String[]{"待支付","已支付","已取消"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        initViews();
        //调取中间人
        p = new iPresenterImpl();
        p.ShowDateRen(new iModelImpl(),this);
    }

    private void initViews() {
        xlv = findViewById(R.id.xlv);
        image = findViewById(R.id.image);
        image.setOnClickListener(this);
        //设置布局管理器
        //设置布局管理器
        xlv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        xlv.addItemDecoration(new MyDecoration(this, MyDecoration.VERTICAL_LIST));
        //支持上拉加载下拉刷新
        xlv.setPullRefreshEnabled(true);//下拉刷新
        xlv.setLoadingMoreEnabled(true);//上拉加载
        xlv.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);//样式
        //上拉下拉监听
        xlv.setLoadingListener(new XRecyclerView.LoadingListener() {
            @Override
            public void onRefresh() {
                 page=0;
                 p.ShowRefresh(page,new iModelImpl(),MainActivity.this);
            }

            @Override
            public void onLoadMore() {
               p.ShowLoading(++page,new iModelImpl(),MainActivity.this);
            }
        });
    }

    //初始化数据
    @Override
    public void ShowDate(List<Dben.DataBean> data) {
        this.data=data;
        XlvAdaper xa=new XlvAdaper(this,data);
        xlv.setAdapter(xa);
    }
    //失败的方法
    @Override
    public void Error(String errors) {

    }
   //上拉刷新
    @Override
    public void RefreshtoDate(List<Dben.DataBean> data) {
        XlvAdaper xa=new XlvAdaper(this,data);
        xlv.setAdapter(xa);
        xlv.refreshComplete();
    }
   //下拉加载
    @Override
    public void LoadingtoDate(List<Dben.DataBean> data) {
        XlvAdaper xa=new XlvAdaper(this,data);
        xlv.setAdapter(xa);
        xlv.loadMoreComplete();
    }
    //取消订单方法
    @Override
    public void quxiaoDate() {
        Log.e("AAAAAA","AASDASDASDAD");
        p.ShowDateRen(new iModelImpl(),this);
    }

    @Override
    public void onClick(View view) {
         switch (view.getId()){
             case R.id.image:
                 View inflate = LayoutInflater.from(this).inflate(R.layout.pp, null);
                 //设置view里面的数据
                 ListView listView = inflate.findViewById(R.id.listView);
                 listView.setAdapter(new BaseAdapter() {
                     @Override
                     public int getCount() {
                         return item.length;
                     }

                     @Override
                     public Object getItem(int i) {
                         return null;
                     }

                     @Override
                     public long getItemId(int i) {

                         return 0;
                     }

                     @Override
                     public View getView(int i, View view, ViewGroup viewGroup) {
                         TextView textView=new TextView(MainActivity.this);
                         textView.setText(item[i]);
                         textView.setTextSize(20);
                         return textView;
                     }
                 });
                 //实例出一个PopupWindow
                 final PopupWindow popupWindow = new PopupWindow(inflate, 200, ViewGroup.LayoutParams.WRAP_CONTENT);
                 popupWindow.setBackgroundDrawable(new ColorDrawable(getResources().getColor(android.R.color.transparent)));
                 popupWindow.setOutsideTouchable(true);
                 popupWindow.showAsDropDown(image,0,10);
                 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                     @Override
                     public void onItemClick(AdapterView<?> adapterView, View view, final int i, final long l) {
                         runOnUiThread(new Runnable() {
                             @Override
                             public void run() {
                                 List<Dben.DataBean> list=new ArrayList<>();
                                 for (int j = 0; j <data.size(); j++) {
                                     if(data.get(j).getStatus()==i){
                                           list.add(data.get(j));
                                     }
                                 }
                                 XlvAdaper xa=new XlvAdaper(MainActivity.this,list);
                                 xlv.setAdapter(xa);
                                 popupWindow.dismiss();
                             }
                         });
                     }
                 });
                 break;
         }
    }
}
//适配器

public class XlvAdaper extends XRecyclerView.Adapter<XlvAdaper.MyHolder> {
    Context context;
    List<Dben.DataBean> data;

    public XlvAdaper(Context context, List<Dben.DataBean> data) {
        this.context = context;
        this.data = data;
    }
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View inflate = LayoutInflater.from(context).inflate(R.layout.xlv_item, parent, false);
        MyHolder m=new MyHolder(inflate);
        return m;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, final int position) {
            //赋值
            holder.title.setText(data.get(position).getTitle());
            holder.times.setText(data.get(position).getCreatetime());
            holder.price.setText(data.get(position).getPrice()+"");
            String bt_text = "";
            String tv_text = "";
            if(data.get(position).getStatus()==0){
                tv_text="待支付";
                bt_text="取消订单";
            }else if(data.get(position).getStatus()==1){
                tv_text="已支付";
                bt_text="查看订单";
            }else{
                tv_text="已取消";
                bt_text="查看订单";
            }
            holder.zt.setText(tv_text);
            holder.update.setText(bt_text);

            //付货状态的点击监听
        holder.update.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //弹出AlertDailog
                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setTitle("提示");
                builder.setMessage("是否取消?");
                AlertDialog alertDialog = builder.create();
                builder.setPositiveButton("是", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //修改Bean的数据的状态
                        //请求接口,取消订单
                        data.get(position).setStatus(2);
                        Dben.DataBean dataBean = data.get(position);
                        iPresenterImpl p=new iPresenterImpl();
                        p.Showquxiao(dataBean,new iModelImpl(), (iView) context);

                    }
                });
                builder.setNegativeButton("否", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                builder.show();
            }
        });

    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    class MyHolder extends XRecyclerView.ViewHolder{
        public TextView title;
        public TextView price;
        public TextView times;
        public TextView zt;
        public Button   update;
        public MyHolder(View itemView) {
            super(itemView);
            this.title=itemView.findViewById(R.id.title);
            this.times=itemView.findViewById(R.id.times);
            this.price=itemView.findViewById(R.id.price);
            this.zt=itemView.findViewById(R.id.zt);
            this.update=itemView.findViewById(R.id.update);
        }
    }
}


//自定义控件 RecyclerView的分割线

public class MyDecoration extends RecyclerView.ItemDecoration {

	private Context mContext;
	private Drawable mDivider;
	private int mOrientation;
	public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
	public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

	//我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置
	public static final int[] ATRRS = new int[]{
			android.R.attr.listDivider
	};

	public MyDecoration(Context context, int orientation) {
		this.mContext = context;
		final TypedArray ta = context.obtainStyledAttributes(ATRRS);
		this.mDivider = ta.getDrawable(0);
		ta.recycle();
		setOrientation(orientation);
	}

	//设置屏幕的方向
	public void setOrientation(int orientation) {
		if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
			throw new IllegalArgumentException("invalid orientation");
		}
		mOrientation = orientation;
	}

	@Override
	public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
		if (mOrientation == HORIZONTAL_LIST) {
			drawVerticalLine(c, parent, state);
		} else {
			drawHorizontalLine(c, parent, state);
		}
	}

	//画横线, 这里的parent其实是显示在屏幕显示的这部分
	public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
		int left = parent.getPaddingLeft();
		int right = parent.getWidth() - parent.getPaddingRight();
		final int childCount = parent.getChildCount();
		for (int i = 0; i < childCount; i++) {
			final View child = parent.getChildAt(i);

			//获得child的布局信息
			final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
			final int top = child.getBottom() + params.bottomMargin;
			final int bottom = top + mDivider.getIntrinsicHeight();
			mDivider.setBounds(left, top, right, bottom);
			mDivider.draw(c);
			//Log.d("wnw", left + " " + top + " "+right+"   "+bottom+" "+i);
		}
	}

	//画竖线
	public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
		int top = parent.getPaddingTop();
		int bottom = parent.getHeight() - parent.getPaddingBottom();
		final int childCount = parent.getChildCount();
		for (int i = 0; i < childCount; i++) {
			final View child = parent.getChildAt(i);

			//获得child的布局信息
			final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
			final int left = child.getRight() + params.rightMargin;
			final int right = left + mDivider.getIntrinsicWidth();
			mDivider.setBounds(left, top, right, bottom);
			mDivider.draw(c);
		}
	}

	//由于Divider也有长宽高,每一个Item需要向下或者向右偏移
	@Override
	public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
		if (mOrientation == HORIZONTAL_LIST) {
			//画横线,就是往下偏移一个分割线的高度
			outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
		} else {
			//画竖线,就是往右偏移一个分割线的宽度
			outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
		}
	}
}
Model层

//接口

public interface iModel {
    //初始化页面的接口
    void InitDate(String url, Map<String,String> map,ModelListener modelListener);
    //下拉刷新的接口
    void RefreshDate(String url, Map<String,String> map,ModelListener modelListener);
    //上拉加载的接口
    void LoadingDate(String url, Map<String,String> map,ModelListener modelListener);
    //取消订单的接口
    void quxiao(String url, Map<String,String> map,ModelListener modelListener);
}
//实现类
public class iModelImpl implements iModel{
    @Override
    public void InitDate(String url, Map<String, String> map, final ModelListener modelListener) {
        MyOkHttp danli = MyOkHttp.danli();
        danli.setMyOkHttpListener(new MyOkHttpListener() {
            @Override
            public void success(String json) {
                  modelListener.Success(json);
            }

            @Override
            public void error(String error) {
                  modelListener.Error(error);
            }
        });
        danli.PostOkHttp(url,map);
    }

    @Override
    public void RefreshDate(String url, Map<String, String> map, final ModelListener modelListener) {
        MyOkHttp danli = MyOkHttp.danli();
        danli.setMyOkHttpListener(new MyOkHttpListener() {
            @Override
            public void success(String json) {
                modelListener.Success(json);
            }

            @Override
            public void error(String error) {
                modelListener.Error(error);
            }
        });
        danli.PostOkHttp(url,map);
    }

    @Override
    public void LoadingDate(String url, Map<String, String> map, final ModelListener modelListener) {
        MyOkHttp danli = MyOkHttp.danli();
        danli.setMyOkHttpListener(new MyOkHttpListener() {
            @Override
            public void success(String json) {
                modelListener.Success(json);
            }

            @Override
            public void error(String error) {
                modelListener.Error(error);
            }
        });
        danli.PostOkHttp(url,map);
    }

    @Override
    public void quxiao(String url, Map<String, String> map, final ModelListener modelListener) {
        MyOkHttp danli = MyOkHttp.danli();
        danli.setMyOkHttpListener(new MyOkHttpListener() {
            @Override
            public void success(String json) {
                modelListener.Success(json);
            }

            @Override
            public void error(String error) {
                modelListener.Error(error);
            }
        });
        danli.PostOkHttp(url,map);
    }
}
//回传数据的接口
public interface ModelListener {
    //成功方法
    void Success(String json);
    //失败方法
    void Error(String error);
}
Presenter层

 //接口

public interface iPresenter {
    //展示数据中间人
    void ShowDateRen(iModelImpl iModel, iView iView);
    //展示上拉刷新中间人
    void ShowRefresh(int page,iModelImpl iModel, iView iView);
    //展示下拉假爱中间人
    void ShowLoading(int page,iModelImpl iModel, iView iView);
    //取消订单
    void Showquxiao(Dben.DataBean dataBean, iModelImpl iModel, iView iView);
}
//实现类
public class iPresenterImpl implements iPresenter{
    @Override
    public void ShowDateRen(final iModelImpl iModel, final iView iView) {
        Map<String, String> map=new HashMap<>();
            map.put("uid","71");
            iModel.InitDate(HttpConfig.order_url, map, new ModelListener() {
                @Override
                public void Success(String json) {
                    Gson g=new Gson();
                    Dben dben = g.fromJson(json, Dben.class);
                    List<Dben.DataBean> data = dben.getData();
                    Log.e("TAG",data.get(2).getTitle()+"=="+data.get(2).getStatus());
                    iView.ShowDate(data);
                }

                @Override
                public void Error(String error) {
                   iView.Error(error);
                }
            });
    }
    //下拉刷新
    @Override
    public void ShowRefresh(int page, iModelImpl iModel, final iView iView) {
        Map<String, String> map=new HashMap<>();
        map.put("uid","71");
        map.put("page",page+"");
        iModel.RefreshDate(HttpConfig.order_url, map, new ModelListener() {
            @Override
            public void Success(String json) {
                Gson g=new Gson();
                Dben dben = g.fromJson(json, Dben.class);
                List<Dben.DataBean> data = dben.getData();
                iView.RefreshtoDate(data);
            }

            @Override
            public void Error(String error) {
                iView.Error(error);
            }
        });
    }
     //上拉加载
    @Override
    public void ShowLoading(int page, iModelImpl iModel, final iView iView) {
        Map<String, String> map=new HashMap<>();
        Log.e("TAG",page+"aaaaaaaaaaaaaaaa");
        map.put("uid","71");
        map.put("page",page+"");
        iModel.LoadingDate(HttpConfig.order_url, map, new ModelListener() {
            @Override
            public void Success(String json) {
                Gson g=new Gson();
                Dben dben = g.fromJson(json, Dben.class);
                List<Dben.DataBean> data = dben.getData();
                iView.RefreshtoDate(data);
            }

            @Override
            public void Error(String error) {
                iView.Error(error);
            }
        });
    }

    @Override
    public void Showquxiao(Dben.DataBean dataBean, iModelImpl iModel, final iView iView) {
        Map<String, String> map=new HashMap<>();
        map.put("uid","71");
        map.put("orderId ",dataBean.getOrderid()+"");
        map.put("status",dataBean.getStatus()+"");
        Log.e("TAG",dataBean.getTitle()+"=="+dataBean.getStatus());
        iModel.quxiao(HttpConfig.update_url, map, new ModelListener() {
            @Override
            public void Success(String json) {
                Log.e("gaibian",json+"aaaaaa");
                iView.quxiaoDate();
            }

            @Override
            public void Error(String error) {
                iView.Error(error);
            }
        });
    }
}
//OkHttp工具类
public class MyOkHttp {
    //单例模式
    private  static MyOkHttp myOkHttp=null;
    MyHandler myHandler=new MyHandler();
    MyOkHttpListener myOkHttpListener;
    public static MyOkHttp danli(){
        if(myOkHttp==null){
            myOkHttp=new MyOkHttp();
        }
        return myOkHttp;
    }

    //get
    public void getOkHttp(String url){
        OkHttpClient client=new OkHttpClient();
        Request request=new Request.Builder().url(url).build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                    Message msg=new Message();
                    msg.what=0;
                    msg.obj=e.toString();
                    myHandler.sendMessage(msg);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Message msg=new Message();
                msg.what=1;
                msg.obj=response.body().string();
                myHandler.sendMessage(msg);
            }
        });
    }

    //post
    public void PostOkHttp(String url, Map<String,String> map){
              OkHttpClient client=new OkHttpClient.Builder().addInterceptor(new MyInter()).build();
              //创建FromBody
              FormBody.Builder  builder=new FormBody.Builder();
              //遍历map
              Set<String> keys = map.keySet();
        for (String key:keys) {
            String v = map.get(key);
            builder.add(key,v);
        }
        //build
        FormBody build = builder.build();
        Request request=new Request.Builder().url(url).post(build).build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Message msg=new Message();
                msg.what=0;
                msg.obj=e.toString();
                myHandler.sendMessage(msg);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                Message msg=new Message();
                msg.what=1;
                msg.obj=response.body().string();
                myHandler.sendMessage(msg);
            }
        });
    }

    //拦截器
    class MyInter implements Interceptor {

        @Override
        public Response intercept(Chain chain) throws IOException {
            //获取原来的body
            Request request = chain.request();
            RequestBody body = request.body();
            if(body instanceof FormBody){
                //遍历原来的所有参数,加到新的Body里面,最后将公共参数加到新的Body
                FormBody.Builder  newBuilder=new FormBody.Builder();
                for (int i = 0; i <((FormBody) body).size() ; i++) {
                    String name = ((FormBody) body).name(i);
                    String value = ((FormBody) body).value(i);
                    //放入新的
                    newBuilder.add(name,value);
                }
                //在将公共参数添加进去
                FormBody newBody = newBuilder.add("source", "android").build();
                //创建新的请求
                Request build = request.newBuilder().post(newBody).build();
                Response response = chain.proceed(build);
                return response;
            }
            return null;
        }
    }


    //外部访问的方法
    public void setMyOkHttpListener(MyOkHttpListener myOkHttpListener){
        this.myOkHttpListener=myOkHttpListener;
    }
    //Handler
    class MyHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what){
                case 0:
                    String error= (String) msg.obj;
                    myOkHttpListener.error(error);
                    break;
                case 1:
                    String json= (String) msg.obj;
                    myOkHttpListener.success(json);
                    break;
            }
        }
    }
}



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值