关于实现订单的一些相关功能(仅供参考)

相关依赖
/* Retrofit 依赖 / implementation ‘com.squareup.retrofit2:retrofit:2.9.0’
/
Gson转换器 依赖 / implementation ‘com.squareup.retrofit2:converter-gson:2.9.0’
/
EventBus 依赖 / implementation ‘org.greenrobot:eventbus:3.2.0’
/
ButterKnife 依赖 /
implementation ‘com.jakewharton:butterknife:10.2.3’
annotationProcessor ‘com.jakewharton:butterknife-compiler:10.2.3’
/
Fresco 依赖 /
implementation ‘com.facebook.fresco:fresco:2.3.0’
implementation ‘com.facebook.fresco:animated-gif:2.3.0’//加载g
/
OkHttp的依赖库 / implementation ‘com.squareup.okhttp3:okhttp:4.9.0’
/
OkHttp日志拦截器依赖 / implementation ‘com.squareup.okhttp3:logging-interceptor:4.9.0’
implementation ‘androidx.recyclerview:recyclerview:1.1.0’//添加RecycleView依赖
/
RxJava 依赖 / implementation ‘io.reactivex.rxjava2:rxjava:2.0.1’
/
RxAndroid 依赖 / implementation ‘io.reactivex.rxjava2:rxandroid:2.0.1’
/
Retrofit支持RxJava2 依赖 / implementation ‘com.squareup.retrofit2:adapter-rxjava2:+’
implementation ‘com.android.support:design:29.0.0’//tablayout 依赖
/
定位implementation ‘com.amap.api:location:latest.integration’
Android 报错方法数大于 报 65536个解决方案 个 错误信息:
Error: Cannot fit requested classes in a single dex file (# methods: 149346 > 65536)
/方法数超过65536个需要引入该依赖/
implementation ‘com.android.support:multidex:1.0.0’
/build.gradle中defaultConfig中加入该属性/ multiDexEnabled true

使用MVP框架

相关代码实现
地址接口
public interface Constant {

String BASE_URL = "http://47.94.132.125/";
String CART_URL = "api2021/z420210414.json";

}

使用Fresco和Realm
public class MyApp extends Application {

@Override
public void onCreate() {super.onCreate();Fresco.initialize(this);Realm.init(this);RealmConfiguration configuration = new RealmConfiguration.Builder().name("bw.realm").schemaVersion(1).build();
}

}

public interface ApiService {

@GET(Constant.CART_URL)
Observable<JavaBean> getCartData();

}

封装数据源JavaBean,有内部类和Realm冲突
public class JavaBean extends RealmObject {

private String id;private int state;// 1 待支付  2 待收货  3 待评价  4 取消订单 5 已完成private String time;public String getTime() {return time;
}
public void setTime(String time) {this.time = time;
}
private RealmList<ShopcartBean> shopcart;public String getId() {return id;
}
public void setId(String id) {this.id = id;
}
public int getState() {return state;
}
public void setState(int state) {this.state = state;
}
public RealmList<ShopcartBean> getShopcart() {return shopcart;
}
public void setShopcart(RealmList<ShopcartBean> shopcart) {this.shopcart = shopcart;
}

}

JavaBean中拆分的内部类
public class ShopcartBean extends RealmObject {

/*** shopname : 柏丽雅诗日韩新款时尚双肩包* style : 黑色  大* price : 69.00* count : 1* image : http://47.94.132.125/api2021/images/z420210414001.png*/
private String shopname;
private String style;
private String price;
private int count;
private String image;
private boolean isChecked;//TODO 添加了 是否选中单个商品public boolean isChecked() {return isChecked;
}
public void setChecked(boolean checked) {isChecked = checked;
}
public String getShopname() {return shopname;
}
public void setShopname(String shopname) {this.shopname = shopname;
}
public String getStyle() {return style;
}
public void setStyle(String style) {this.style = style;
}
public String getPrice() {return price;
}
public void setPrice(String price) {this.price = price;
}
public int getCount() {return count;
}
public void setCount(int count) {this.count = count;
}
public String getImage() {return image;
}
public void setImage(String image) {this.image = image;
}

}

网络工具类中用Gson解析器和Rxjava2以及日志拦截器
public class RetrofitManager {

private Retrofit retrofit;
private ApiService apiService;
private static RetrofitManager retrofitManager = null;private RetrofitManager(){//TODO 拦截器HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);//TODO OkHttpClientOkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5000, TimeUnit.SECONDS).readTimeout(5000,TimeUnit.SECONDS).addInterceptor(interceptor).build();//TODO Retrofitretrofit = new Retrofit.Builder().baseUrl(Constant.BASE_URL).client(okHttpClient).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();
}public static RetrofitManager getInstance() {if(retrofitManager==null){synchronized (RetrofitManager.class){if(retrofitManager==null){retrofitManager = new RetrofitManager();}}}return retrofitManager;
}public ApiService getApiService() {if(apiService == null){apiService = retrofit.create(ApiService.class);}return apiService;
}public boolean isNetWorkConn(Context context){ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = manager.getActiveNetworkInfo();if(networkInfo!=null && networkInfo.isConnected()) return true;return false;
}

}

下面是关于MVP架构
BaseView

BasePresenter

MVP的继承类

public interface MainContract {
public interface MainView extends BaseView{
void success(JavaBean javaBean);
void error();
}
public interface IMainPresenter{
void getCartData();
}
}

MainPresenter

MainActivity

public class MainActivity extends BaseActivity implements MainContract.MainView {

@BindView(R.id.no_data_layout)
LinearLayout noDataLayout;
@BindView(R.id.yes_data_layout)
LinearLayout yesDataLayout;
@BindView(R.id.edit_tv_id)
TextView editTv;
@BindView(R.id.over_tv_id)
TextView overTv;
@BindView(R.id.recycler_view_id)
RecyclerView recyclerView;
@BindView(R.id.all_cb_id)
CheckBox allCheckBox;
@BindView(R.id.all_price_tv_id)
TextView allPriceTv;
@BindView(R.id.js_button_id)
Button jsButton;
@BindView(R.id.sc_button_id)
Button scButton;
private List<ShopcartBean> data;//全局变量的购物车显示的内容
private CartAdapter adapter;
@Override
protected int getLayout() {return R.layout.activity_main;
}
@Override
protected void initView() {dingwei();
}
@Override
protected MainPresenter initPresenter() {return new MainPresenter();
}
@Override
protected void initData() {getPresenter().getCartData();
}
@Override
public void success(JavaBean javaBean) {Log.e("TAG","---"+javaBean.toString());if(javaBean!=null){data = javaBean.getShopcart();recyclerView.setLayoutManager(new LinearLayoutManager(this));adapter = new CartAdapter(this,data);recyclerView.setAdapter(adapter);}
}
@Override
public void error() {
}
//TODO 监听器
@OnClick({R.id.all_cb_id,R.id.edit_tv_id,R.id.over_tv_id,R.id.sc_button_id,R.id.js_button_id})
public void onClick(View view){switch (view.getId()){case R.id.all_cb_id://TODO -----全选-------------boolean isChecked = allCheckBox.isChecked(); //TODO 得到当前“全选”框的状态for (int i = 0; i < data.size(); i++) {  //TODO 遍历所有的购物车内容, 然后修改他们的状态data.get(i).setChecked(isChecked);}caleTotal();break;case R.id.edit_tv_id://TODO ------编辑---------allPriceTv.setVisibility(View.GONE);jsButton.setVisibility(View.GONE);editTv.setVisibility(View.GONE);overTv.setVisibility(View.VISIBLE);scButton.setVisibility(View.VISIBLE);break;case R.id.over_tv_id://TODO ------完成---------allPriceTv.setVisibility(View.VISIBLE);jsButton.setVisibility(View.VISIBLE);editTv.setVisibility(View.VISIBLE);overTv.setVisibility(View.GONE);scButton.setVisibility(View.GONE);if(data.size()>0){noDataLayout.setVisibility(View.GONE);yesDataLayout.setVisibility(View.VISIBLE);}else {noDataLayout.setVisibility(View.VISIBLE);yesDataLayout.setVisibility(View.GONE);}caleTotal();break;case R.id.sc_button_id://TODO ------删除---------for (int i = 0; i < data.size(); i++) {ShopcartBean shopcartBean = data.get(i);if(shopcartBean.isChecked()){data.remove(shopcartBean);}}adapter.notifyDataSetChanged();caleTotal();break;case R.id.js_button_id://TODO ------结算---------//TODO  构建用户选中的商品集合List<ShopcartBean> shopCartBeanList = new ArrayList<>();for (int i = 0; i < data.size(); i++) {if(data.get(i).isChecked()){shopCartBeanList.add(data.get(i));}}//TODO 传值EventBus.getDefault().postSticky(shopCartBeanList);startActivity(new Intent(MainActivity.this,QrOrderActivity.class));break;}
}
//TODO 计算所有选中商品的数量+价格
int totalCount;//总数
int totalPrice;//总价
public void caleTotal(){boolean isAllChecked = true;totalCount = 0;//重置totalPrice = 0;for (int i = 0; i < data.size(); i++) {ShopcartBean shopcartBean = data.get(i);if(shopcartBean.isChecked()){//判断当前数据被选中totalCount+=1;//累积数量//累积价格double price = Double.valueOf(shopcartBean.getPrice());totalPrice+= price * shopcartBean.getCount();}else {isAllChecked = false;}}adapter.notifyDataSetChanged();//刷新适配器//页面显示累积的数量和价格allPriceTv.setText("总价:" + totalPrice);jsButton.setText("结算("+totalCount+")");allCheckBox.setChecked(isAllChecked);//设置全选的状态//TODO 判断总数量如果不为0 , 可以删除/编辑if(totalCount>0){jsButton.setEnabled(true);scButton.setEnabled(true);}else {jsButton.setEnabled(false);scButton.setEnabled(false);}
}
//TODO ---- EventBus : 处理总价+总量---
@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEvent(String msg){if("计算总价和总量".equals(msg)){caleTotal();}
}
@Override
protected void onStart() {super.onStart();EventBus.getDefault().register(this);
}
@Override
protected void onStop() {super.onStop();EventBus.getDefault().unregister(this);
}
//TODO -----  定位 -----
public void dingwei(){//声明AMapLocationClient类对象AMapLocationClient mLocationClient = new AMapLocationClient(getApplicationContext());//声明定位回调监听器//设置定位回调监听mLocationClient.setLocationListener(new AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {double wd = aMapLocation.getLatitude();//获取纬度double jd = aMapLocation.getLongitude();//获取经度Log.e("TAG","纬度:" + wd +",经度:  "+jd);}});//启动定位mLocationClient.startLocation();
}

}

通过点击结算按钮,跳到确认订单页面
public class QrOrderActivity extends AppCompatActivity {

private List<ShopcartBean> shopCartBeans;//接收传入的参数
private Unbinder unbinder;
@BindView(R.id.recycler_view_id)
RecyclerView recyclerView;
@BindView(R.id.all_price_tv_id)
TextView allPriceTv;
private Realm realm;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_qr_order);unbinder = ButterKnife.bind(this);realm = Realm.getDefaultInstance();
}//TODO ---- 去支付 ----
@OnClick(R.id.qzf_button_id)
public void qzfClick(){//TODO  将当前的支付的商品,存入到数据库的订单信息中realm.beginTransaction();JavaBean javaBean = new JavaBean();//TODO 设置idString id = UUID.randomUUID().toString();javaBean.setId(id);javaBean.setState(1); //TODO 设置订单的状态SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String time = df.format(new Date(System.currentTimeMillis()));javaBean.setTime(time);//TODO 设置当前订单生成的时间//TODO 设置数据RealmList<ShopcartBean> realmList = new RealmList<>();for (int i = 0; i < shopCartBeans.size(); i++) {realmList.add(shopCartBeans.get(i));}javaBean.setShopcart(realmList);//TODO 提交数据realm.copyToRealm(javaBean);realm.commitTransaction();//TODO 跳转进入支付页面Intent intent = new Intent(this,ZfActivity.class);intent.putExtra("id",id);startActivity(intent);finish();
}
//TODO ---- EventBus 得到购物车中,传入的需要支付的商品---
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void getCartShop(List<ShopcartBean> shopCartBeans){this.shopCartBeans = shopCartBeans;//展示数据recyclerView.setLayoutManager(new LinearLayoutManager(this));QrOrderAdapter adapter = new QrOrderAdapter(this,shopCartBeans);recyclerView.setAdapter(adapter);//计算总价caleTotal();
}
//TODO 计算所有选中商品的价格
int totalPrice;//总价
public void caleTotal(){totalPrice = 0;for (int i = 0; i < shopCartBeans.size(); i++) {ShopcartBean shopcartBean = shopCartBeans.get(i);if(shopcartBean.isChecked()){//判断当前数据被选中//累积价格double price = Double.valueOf(shopcartBean.getPrice());totalPrice+= price * shopcartBean.getCount();}}allPriceTv.setText("总价:" + totalPrice);
}
@Override
protected void onStart() {super.onStart();EventBus.getDefault().register(this);
}
@Override
protected void onStop() {super.onStop();EventBus.getDefault().unregister(this);
}
@Override
protected void onDestroy() {super.onDestroy();unbinder.unbind();
}

}

点击确认支付,跳转到支付页面
public class ZfActivity extends AppCompatActivity {

private Unbinder unbinder;
private String id;
private Realm realm;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_zf);unbinder = ButterKnife.bind(this);//获取传入的id参数id = getIntent().getStringExtra("id");realm = Realm.getDefaultInstance();
}
@OnClick({R.id.close_image_id,R.id.pay_id})
public void onClick(View view){switch (view.getId()){case R.id.close_image_id:startActivity(new Intent(this,OrderActivity.class));finish();break;case R.id.pay_id://TODO ---- 确认支付 ---- 修改订单中状态 ---realm.beginTransaction();JavaBean javaBean = realm.where(JavaBean.class).equalTo("id",id).findFirst();//根据id查询数据库中的内容javaBean.setState(2);//支付完成  -- 状态修改为: 2  待收货realm.commitTransaction();//todo 支付完成后, 进入订单页面startActivity(new Intent(this,OrderActivity.class));finish();break;}
}
@Override
protected void onDestroy() {super.onDestroy();unbinder.unbind();
}

}

支付完成后进入到订单页面(内含tablayout)
public class OrderActivity extends AppCompatActivity {

private Unbinder unbinder;
@BindView(R.id.tab_layout_id)
TabLayout tabLayout;
@BindView(R.id.recycler_view_id)
RecyclerView recyclerView;
@BindView(R.id.no_data_image_id)
ImageView imageView;
private Realm realm;
private String[] titles = {"全部","待支付","待收货","待评价","取消订单","已完成"};
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_order);realm = Realm.getDefaultInstance();unbinder = ButterKnife.bind(this);initTab();initData(0);//TODO 默认加载全部
}
//TODO 构建标签
private void initTab() {for (int i = 0; i < titles.length; i++) {tabLayout.addTab(tabLayout.newTab().setText(titles[i]));}tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {switch (tab.getPosition()){case 0:recyclerView.setVisibility(View.VISIBLE);imageView.setVisibility(View.GONE);initData(0);break;case 1:recyclerView.setVisibility(View.VISIBLE);imageView.setVisibility(View.GONE);initData(1);break;default:recyclerView.setVisibility(View.GONE);imageView.setVisibility(View.VISIBLE);break;}}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {}@Overridepublic void onTabReselected(TabLayout.Tab tab) {}});
}
//TODO 加载数据
private void initData(int state){RealmResults<JavaBean> javaBeans = null;if(state == 0){//全部javaBeans = realm.where(JavaBean.class).findAll();}else if(state == 1){//待支付javaBeans = realm.where(JavaBean.class).equalTo("state", 1).findAll();}//设置适配器if(javaBeans!=null && javaBeans.size()>0){recyclerView.setLayoutManager(new LinearLayoutManager(this));HomeOrderAdapter adapter  = new HomeOrderAdapter(this,javaBeans);recyclerView.setAdapter(adapter);}
}
@Override
protected void onDestroy() {super.onDestroy();unbinder.unbind();
}

}

第一个适配器,订单下载数据
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ViewHolder> {

private Context context;
private List<ShopcartBean> data;
public CartAdapter(Context context, List<ShopcartBean> data) {this.context = context;this.data = data;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new ViewHolder(View.inflate(context,R.layout.cart_item,null));
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.checkBox.setChecked(data.get(position).isChecked());holder.simpleDraweeView.setImageURI(data.get(position).getImage());holder.nameTv.setText(data.get(position).getShopname());holder.priceTv.setText("¥"+data.get(position).getPrice());holder.addAndMinusView.setCount(data.get(position));//TODO 点击多选框, 更改总价+总量holder.checkBox.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {boolean isChecked = holder.checkBox.isChecked();//得到当前控件的状态data.get(position).setChecked(isChecked);//将当前的状态,设置到数据源中EventBus.getDefault().post("计算总价和总量");}});
}
@Override
public int getItemCount() {return data.size();
}
class ViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.cb_id)CheckBox checkBox;@BindView(R.id.sdv_id)SimpleDraweeView simpleDraweeView;@BindView(R.id.name_id)TextView nameTv;@BindView(R.id.price_id)TextView priceTv;@BindView(R.id.add_minus_id)AddAndMinusView addAndMinusView;public ViewHolder(@NonNull View itemView) {super(itemView);ButterKnife.bind(this,itemView);}
}

}

第二个适配器,确认订单的适配器
public class QrOrderAdapter extends RecyclerView.Adapter<QrOrderAdapter.ViewHolder> {

private Context context;
private List<ShopcartBean> data;
public QrOrderAdapter(Context context, List<ShopcartBean> data) {this.context = context;this.data = data;
}@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new ViewHolder(View.inflate(context,R.layout.qr_order_item,null));
}@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.simpleDraweeView.setImageURI(data.get(position).getImage());holder.nameTv.setText(data.get(position).getShopname());holder.priceTv.setText("¥"+data.get(position).getPrice());holder.addAndMinusView.setCount(data.get(position));
}@Override
public int getItemCount() {return data.size();
}class ViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.sdv_id)SimpleDraweeView simpleDraweeView;@BindView(R.id.name_id)TextView nameTv;@BindView(R.id.price_id)TextView priceTv;@BindView(R.id.add_minus_id)AddAndMinusView addAndMinusView;public ViewHolder(@NonNull View itemView) {super(itemView);ButterKnife.bind(this,itemView);}
}

}

第三个适配器 ,待支付适配器

public class DzfAdapter extends RecyclerView.Adapter<DzfAdapter.ViewHolder> {

private Context context;
private List<ShopcartBean> data;
public DzfAdapter(Context context, List<ShopcartBean> data) {this.context = context;this.data = data;
}@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new ViewHolder(View.inflate(context,R.layout.dzf_item,null));
}@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.simpleDraweeView.setImageURI(data.get(position).getImage());holder.nameTv.setText(data.get(position).getShopname());holder.priceTv.setText("¥ "+ data.get(position).getPrice());holder.numTv.setText("x"+data.get(position).getCount());
}@Override
public int getItemCount() {return data.size();
}class ViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.name_id)TextView nameTv;@BindView(R.id.price_id)TextView priceTv;@BindView(R.id.sdv_id)SimpleDraweeView simpleDraweeView;@BindView(R.id.tv_num)TextView numTv;public ViewHolder(@NonNull View itemView) {super(itemView);ButterKnife.bind(this,itemView);}
}

}

第四个适配器,待收货适配器
public class QxOrderAdapter extends RecyclerView.Adapter<QxOrderAdapter.ViewHolder> {

private Context context;
private List<ShopcartBean> data;
public QxOrderAdapter(Context context, List<ShopcartBean> data) {this.context = context;this.data = data;
}@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new ViewHolder(View.inflate(context,R.layout.qx_order_item,null));
}@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.simpleDraweeView.setImageURI(data.get(position).getImage());holder.nameTv.setText(data.get(position).getShopname());holder.priceTv.setText("¥ "+ data.get(position).getPrice());holder.numTv.setText("x"+data.get(position).getCount());
}@Override
public int getItemCount() {return data.size();
}class ViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.name_id)TextView nameTv;@BindView(R.id.price_id)TextView priceTv;@BindView(R.id.sdv_id)SimpleDraweeView simpleDraweeView;@BindView(R.id.tv_num)TextView numTv;public ViewHolder(@NonNull View itemView) {super(itemView);ButterKnife.bind(this,itemView);}
}

}

第五个适配器,订单页面的适配器(包括待支付和待收货)
public class HomeOrderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private Context context;
private RealmResults<JavaBean> data;
public HomeOrderAdapter(Context context, RealmResults<JavaBean> data) {this.context = context;this.data = data;
}@Override
public int getItemViewType(int position) {if(data.get(position).getState() == 1){//待支付return 1;}else if(data.get(position).getState()==4){//取消订单return 4;}return 4;
}@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {if(viewType == 1){return new DzfViewHolder(View.inflate(context,R.layout.dzf,null));}else if(viewType == 4){return new QxOrderViewHolder(View.inflate(context,R.layout.qx_order,null));}return null;
}@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {if(holder instanceof DzfViewHolder){//TODO 待支付//TODO --- 总价 ---int totalPrice = 0;List<ShopcartBean> shopcartBeanList = data.get(position).getShopcart();for (int i = 0; i < shopcartBeanList.size(); i++) {ShopcartBean shopcartBean = shopcartBeanList.get(i);double price = Double.valueOf(shopcartBean.getPrice());totalPrice+= price * shopcartBean.getCount();}((DzfViewHolder) holder).allPriceTv.setText("总价:" + totalPrice);//TODO --- 商品信息 ----((DzfViewHolder) holder).recyclerView.setLayoutManager(new LinearLayoutManager(context));((DzfViewHolder) holder).recyclerView.setAdapter(new DzfAdapter(context,data.get(position).getShopcart()));//TODO --- 倒计时 ---getTimeDuring(data.get(position).getTime(),((DzfViewHolder) holder).timeTv,data.get(position).getId());//TODO 点击取消订单((DzfViewHolder) holder).qxButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//倒计时结束: 取消订单Realm realm = Realm.getDefaultInstance();realm.beginTransaction();JavaBean javaBean = realm.where(JavaBean.class).equalTo("id",data.get(position).getId()).findFirst();javaBean.setState(4);//TODO 取消订单realm.commitTransaction();notifyDataSetChanged();//刷新适配器}});}else if(holder instanceof  QxOrderViewHolder){//TODO --- 总价 ---int totalPrice = 0;List<ShopcartBean> shopcartBeanList = data.get(position).getShopcart();for (int i = 0; i < shopcartBeanList.size(); i++) {ShopcartBean shopcartBean = shopcartBeanList.get(i);double price = Double.valueOf(shopcartBean.getPrice());totalPrice+= price * shopcartBean.getCount();}((QxOrderViewHolder) holder).allPriceTv.setText("总价: " + totalPrice);((QxOrderViewHolder) holder).recyclerView.setLayoutManager(new LinearLayoutManager(context));((QxOrderViewHolder) holder).recyclerView.setAdapter(new QxOrderAdapter(context,data.get(position).getShopcart()));}
}
@Override
public int getItemCount() {return data.size();
}
//TODO ---- 声明ViewHolder -----
//TODO 待支付的布局  -- dzf
class DzfViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.time_tv)TextView timeTv;@BindView(R.id.recycler_view_id)RecyclerView recyclerView;@BindView(R.id.all_price_tv_id)TextView allPriceTv;@BindView(R.id.qx_order_button_id)Button qxButton;public DzfViewHolder(@NonNull View itemView) {super(itemView);ButterKnife.bind(this,itemView);}
}
//TODO 订单取消的布局 -- qx_order
class QxOrderViewHolder extends RecyclerView.ViewHolder{@BindView(R.id.recycler_view_id)RecyclerView recyclerView;@BindView(R.id.all_price_tv_id)TextView allPriceTv;public QxOrderViewHolder(@NonNull View itemView) {super(itemView);ButterKnife.bind(this,itemView);}
}
private Handler handler = new Handler();
long countdownTime;//当前显示的倒计时时长
private void getTimeDuring(String timefromServer,TextView timeTv,String id) {int chaoshitime = 10 * 60 * 1000;//应该从服务器获取SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");try {Date serverDate = df.parse(timefromServer);long duringTime = new Date().getTime() - serverDate.getTime();//计算当前时间和从服务器获取的订单生成时间的时间差countdownTime = chaoshitime - duringTime;//计算倒计时的总时间handler.postDelayed(new Runnable() {@Overridepublic void run() {countdownTime -= 1000;//倒计时总时间减1SimpleDateFormat minforamt = new SimpleDateFormat("mm:ss");String hms = minforamt.format(countdownTime);//格式化倒计时的总时间timeTv.setText("倒计时:" + hms);if(hms.equals("00:00")){//倒计时结束: 取消订单Realm realm = Realm.getDefaultInstance();realm.beginTransaction();JavaBean javaBean = realm.where(JavaBean.class).equalTo("id",id).findFirst();javaBean.setState(4);//TODO 取消订单realm.commitTransaction();notifyDataSetChanged();//刷新适配器}else {handler.postDelayed(this, 1000);}}}, 1000);} catch (ParseException e) {e.printStackTrace();}
}

}

主页面的布局(复选框会涉及到全选等功能,检查仔细)

<?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"
tools:context=".view.activity.MainActivity"
android:orientation="vertical"
><!--没有数据显示的布局-->
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:id="@+id/no_data_layout"android:visibility="gone"><TextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#00f"android:gravity="center"android:text="购物车"android:textSize="30sp"android:textColor="#fff"/><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@mipmap/error"/>
</LinearLayout>
<!--有数据-->
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/yes_data_layout"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#00f"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="购物车"android:textColor="#fff"android:textSize="30sp"android:layout_centerInParent="true"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="编辑"android:textSize="20sp"android:textColor="#f00"android:layout_alignParentRight="true"android:layout_marginRight="30dp"android:layout_centerVertical="true"android:id="@+id/edit_tv_id"/><TextViewandroid:visibility="gone"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="完成"android:textSize="20sp"android:textColor="#f00"android:layout_alignParentRight="true"android:layout_marginRight="30dp"android:layout_centerVertical="true"android:id="@+id/over_tv_id"/></RelativeLayout><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/recycler_view_id"/><!--底部--><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/all_cb_id"android:text="全选"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/all_price_tv_id"android:text="总价:¥ 0"android:layout_toRightOf="@id/all_cb_id"android:layout_centerVertical="true"android:layout_marginLeft="30dp"/><Buttonandroid:enabled="false"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/js_button_id"android:text="结算(0)"android:layout_alignParentRight="true"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/sc_button_id"android:text="删除"android:visibility="gone"android:enabled="false"android:layout_alignParentRight="true"/></RelativeLayout>
</LinearLayout>

对应第一个适配器,用于加载主页面的数据,加减器

<?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="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_margin="10dp"><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cb_id"/><com.facebook.drawee.view.SimpleDraweeViewandroid:layout_width="80dp"android:layout_height="80dp"app:placeholderImage="@mipmap/loding"app:failureImage="@mipmap/error"android:id="@+id/sdv_id"/>
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/name_id"android:text="商品名称"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/price_id"android:text="¥123"android:textColor="#f00"/><!--加减器--><com.bawei.day17.view.weight.AddAndMinusViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/add_minus_id"android:layout_alignParentRight="true"android:layout_centerVertical="true"/></RelativeLayout>
</LinearLayout>

加减器页面

<?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="50dp"
android:orientation="horizontal"
>
<TextViewandroid:layout_width="30dp"android:layout_height="match_parent"android:text="-"android:id="@+id/tv_minus"android:gravity="center"/>
<TextViewandroid:layout_width="40dp"android:layout_height="match_parent"android:text="0"android:id="@+id/tv_num"android:gravity="center"android:background="#ccc"/>
<TextViewandroid:layout_width="30dp"android:layout_height="match_parent"android:text="+"android:id="@+id/tv_add"android:gravity="center"/>

加减器的代码(有些方法需要在别处调用才能实现)
public class AddAndMinusView extends LinearLayout {

private ShopcartBean data;
private TextView addTv,numTv,minusTv;
public AddAndMinusView(Context context) {super(context);
}

public AddAndMinusView(Context context, @Nullable AttributeSet attrs) {

    super(context, attrs);View.inflate(context, R.layout.add_and_minus,this);addTv = findViewById(R.id.tv_add);numTv = findViewById(R.id.tv_num);minusTv = findViewById(R.id.tv_minus);//TODO 设置 - 的监听器minusTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(data.getCount()>1){int count = data.getCount()-1;data.setCount(count);numTv.setText(String.valueOf(data.getCount()));}else {Toast.makeText(context, "商品数量不能少于1", Toast.LENGTH_SHORT).show();}//TODO 不管是增加还是减少, 最终都需要和总结+总数量挂钩EventBus.getDefault().post("计算总价和总数量");}});//TODO 设置 + 的监听器addTv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {int count = data.getCount()+1;data.setCount(count);//TODO 将当前修改后的数量, 设置到控件上numTv.setText(String.valueOf(data.getCount()));//TODO 不管是增加还是减少, 最终都需要和总结+总数量挂钩EventBus.getDefault().post("计算总价和总数量");}});
}
//TODO 提供设置数量的方法
public void setCount(ShopcartBean shopcartBean){this.data = shopcartBean;numTv.setText(String.valueOf(data.getCount()));
}

}

确认订单页面

<?xml version="1.0" encoding="utf-8"?>

<TextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#00f"android:gravity="center"android:text="确认订单"android:textColor="#fff"android:textSize="30sp"/>
<androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/recycler_view_id"/>
<RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/all_price_tv_id"android:text="总价:¥0"android:layout_centerVertical="true"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:text="去支付"android:id="@+id/qzf_button_id"/>
</RelativeLayout>

确认订单的item

<?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="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_margin="10dp"><CheckBoxandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/cb_id"/><com.facebook.drawee.view.SimpleDraweeViewandroid:layout_width="80dp"android:layout_height="80dp"app:placeholderImage="@mipmap/loding"app:failureImage="@mipmap/error"android:id="@+id/sdv_id"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/name_id"android:text="商品名称"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/price_id"android:text="¥123"android:textColor="#f00"/><!--加载器--><com.bawei.day17.view.weight.AddAndMinusViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/add_minus_id"android:layout_alignParentRight="true"android:layout_centerVertical="true"/></RelativeLayout>
</LinearLayout>

确认订单页面点击去支付跳转到确认支付页面

<?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"
tools:context=".view.activity.ZfActivity"
android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:background="#00f"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="确认支付"android:textColor="#fff"android:textSize="30sp"android:layout_centerInParent="true"/><ImageViewandroid:layout_width="35dp"android:layout_height="35dp"android:src="@mipmap/gb"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:layout_marginRight="30dp"android:id="@+id/close_image_id"/>
</RelativeLayout><RadioGroupandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/rg_id"android:orientation="vertical"android:padding="30dp"><RadioButtonandroid:id="@+id/rb_01"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="微信支付"android:checked="true"/><RadioButtonandroid:id="@+id/rb_02"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="支付宝支付"/>
</RadioGroup><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="确认支付"android:layout_margin="30dp"android:id="@+id/pay_id"/>

点击确认支付进入订单页面

<?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=".view.activity.OrderActivity"><TextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:background="#00f"android:gravity="center"android:text="订单页面"android:textSize="30sp"android:textColor="#fff"/><com.google.android.material.tabs.TabLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/tab_layout_id"/><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="8"android:id="@+id/recycler_view_id"/><ImageViewandroid:visibility="gone"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="8"android:src="@mipmap/error"android:id="@+id/no_data_image_id"/>

订单页面中的tablayout可以实现点击切换订单的状态(包含待支付和取消订单页面)
待支付页面

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"><!-- 待收货的订单Item -->
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="待支付"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/time_tv"android:text="倒计时:"android:textColor="#f00"android:layout_alignParentRight="true"/></RelativeLayout><!-- 订单商品详情 --><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view_id"android:layout_width="match_parent"android:layout_height="wrap_content" /><!-- 商品件数显示区域 --><TextViewandroid:id="@+id/all_price_tv_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="right"android:text="商品总价"android:layout_marginBottom="8dp"/><!-- 操作按钮 --><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/qx_order_button_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="取消订单" /><Buttonandroid:id="@+id/btn_pay"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:textColor="@android:color/white"android:text="去支付" /></RelativeLayout>
</LinearLayout>

待支付Item

<?xml version="1.0" encoding="utf-8"?>

<!-- 商品图片 -->
<com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/sdv_id"android:layout_width="80dp"android:layout_height="80dp"fresco:failureImage="@mipmap/error"fresco:failureImageScaleType="centerCrop"fresco:placeholderImage="@mipmap/loding"fresco:placeholderImageScaleType="centerCrop"fresco:roundAsCircle="true" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 商品名称 --><TextViewandroid:id="@+id/name_id"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:maxLines="3"android:ellipsize="end"android:textSize="12sp"android:text="商品的名称"android:paddingLeft="10dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><!-- 商品价格 --><TextViewandroid:id="@+id/price_id"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:text="¥320"android:textColor="#F00"android:gravity="center_vertical"android:paddingLeft="10dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv_num"android:text="×1"/></LinearLayout></LinearLayout>

取消订单页

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:background="#ccc"><!-- 待收货的订单Item -->
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="订单取消"/><!-- 订单商品详情 --><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view_id"android:layout_width="match_parent"android:layout_height="wrap_content" /><!-- 商品件数显示区域 --><TextViewandroid:id="@+id/all_price_tv_id"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="right"android:text="商品总价"android:layout_marginBottom="8dp"/></LinearLayout>

取消订单页面item 与待收货页面相同

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"><!-- 商品图片 -->
<com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/sdv_id"android:layout_width="80dp"android:layout_height="80dp"fresco:failureImage="@mipmap/error"fresco:failureImageScaleType="centerCrop"fresco:placeholderImage="@mipmap/loding"fresco:placeholderImageScaleType="centerCrop"fresco:roundAsCircle="true" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- 商品名称 --><TextViewandroid:id="@+id/name_id"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:maxLines="3"android:ellipsize="end"android:textSize="12sp"android:text="商品的名称"android:paddingLeft="10dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><!-- 商品价格 --><TextViewandroid:id="@+id/price_id"android:layout_width="0dp"android:layout_weight="1"android:layout_height="match_parent"android:text="¥320"android:textColor="#F00"android:gravity="center_vertical"android:paddingLeft="10dp"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/tv_num"android:text="×1"/></LinearLayout></LinearLayout>

关于实现订单的相关功能实现相关推荐

  1. JSD-2204-(业务逻辑开发)-更新订单状态的功能-搜索功能-Quartz-Day12

    1.开发更新订单状态的功能 1.1订单的状态码 我们电商上面订单的状态修改是非常普通的业务 随着商品的购买流程,订单的状态有 状态: 0=未支付 1=已关闭(超时未支付) 2=已取消 3=已支付 4= ...

  2. SAP MM 采购订单与相关合同的价格差异问题分析

    SAP MM 采购订单与相关合同的价格差异问题分析 笔者所在的项目里,一般生产性物料PO的价格是来自于合同价格的,而合同的价格来自于采购信息记录的价格,业务部门不允许PO里随便改价格的. 但是业务部门 ...

  3. 【Flutter】Flutter 调试 ( 调试控制相关功能 | 断点管理 | 代码运行控制 )

    文章目录 一.调试控制相关功能 二.断点管理 三.代码运行控制 四.相关资源 一.调试控制相关功能 " Return 'main.dart' " 重新运行项目 ; " S ...

  4. (仿头条APP项目)1.app载入界面相关功能实现

    app载入界面相关功能实现 模块功能 1.设置页面布局 2.初始化视频播放 //控制是否跳到主界面private boolean isjump = false;private VideoView vi ...

  5. wxWidgets:wxWidgets 示例演示网络相关功能

    wxWidgets:wxWidgets 示例演示网络相关功能 wxWidgets:wxWidgets 示例演示网络相关功能 wxWidgets:wxWidgets 示例演示网络相关功能 #includ ...

  6. putty上传文件到linux_基于windows安装部署putty小工具及相关功能介绍

    概述 PuTTY是一个Telnet.SSH.rlogin.纯TCP以及串行接口连接软件.较早的版本仅支持Windows平台,在最近的版本中开始支持各类Unix平台,并打算移植至Mac OS X上.除了 ...

  7. linux如何实现相关功能源代码

    如果想进一步了解 linux系统,熟悉一些系统底层的东西还是非常必要的,我们可以先了解一些linux命令是如何实现相关功能的,那么如何获得命令的源代码呢?下面我们详细介绍一下. 下面以获取cat命令的 ...

  8. 零元学Expression Blend 4 - Chapter 25 以Text相关功能就能简单做出具有设计感的登入画面...

    原文:零元学Expression Blend 4 - Chapter 25 以Text相关功能就能简单做出具有设计感的登入画面 本章将交大家如何运用Blend 4 内的Text相关功能做出有设计感的登 ...

  9. 模拟注册用户,按照以下要求实现相关功能:

    package Day08;import java.util.Scanner;/*** 模拟注册用户,按照以下要求实现相关功能:* a. 提示用户在控制台输入手机号码,并接收.* b. 判断用户输入的 ...

最新文章

  1. Deformable 可变形的DETR
  2. 前端项目课程7 banner设计注意事项
  3. 软件工程(2019)第三次个人作业
  4. 团队软件开发第一次冲刺(四)
  5. 《编程珠玑》 读书笔记
  6. Android-HIDL实例解析
  7. CRecordset类
  8. 响应式网页设计简单入门
  9. Git笔记(1) 版本控制
  10. 多线程之操作CopyOnWriteArrayList解决Iterator迭代器产生java.util.ConcurrentModificationException
  11. 更改stata外部命令存放位置
  12. 局域网聊天 java_java实现简易局域网聊天功能
  13. html边框双箭头,纯CSS如何绘制双箭头
  14. 【C++基础之十】友元函数和友元类
  15. 微信热文捕手使用说明
  16. 深度学习论文: Computer Vision for Road Imaging and Pothole Detection: A State-of-the-Art Review
  17. C语言双指针——经典题型
  18. 简易番茄时钟web实现
  19. 02139计算机信息检索-第9章.网络信息检索的未来发展趋势【思维导图】
  20. node.js+vue药品药店进销存管理系统jb526

热门文章

  1. 我与机器斗争过但失败了:与深蓝“人机大战”20年,卡斯帕罗夫TED演讲
  2. 【算法学习笔记】O,Omega,Theta符号的使用
  3. 交叉熵损失函数原理及pytorch实现
  4. 抓取网易公开课并下载
  5. 安卓7.0抓包之商店包(无需root)
  6. 【元宇宙欧米说】探索元宇宙的“数字美学”
  7. 【甘道夫】Hive扩展GIS函数
  8. 289页初中级前端题助你拿下Offer
  9. Kong 网关使用入门
  10. pandas基础 -- Series数据结构