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

被折叠的 条评论
为什么被折叠?



