Android笔记(七十六) 点菜DEMO
一个朋友让看一下他的代码,一个点菜的功能,他和我一样,初学者,代码比我的都混乱,也是醉了,干脆想着自己写个demo给他看,原本想着听简单,半个小时应该就可以搞定,真正写的时候,画了3h+,汗颜。。。
现在将过程捋一下,做个备忘:
原本想的时候,不就是一个ListView么,每个item除了菜品信息之外,包含两个按钮,和一个EditText,用来修改数量,于是有了第一版(请忽略界面):
MainActivity.java
package com.example.menutest; import java.util.ArrayList;
import java.util.List; import com.example.menutest.adapter.ShowFoodAdapter;
import com.example.menutest.bean.Food; import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.ListView; public class MainActivity extends Activity { private ListView lv_foods;
private Button bt_submit;
private List<Food> foodsList = new ArrayList<Food>();
private ShowFoodAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
adapter = new ShowFoodAdapter(foodsList, this);
lv_foods.setAdapter(adapter); } // 初始化菜品数据
private void initData() {
foodsList.add(new Food("bawangshizitou", "霸王狮子头", 23));
foodsList.add(new Food("dongbeiguobaorou", "东北锅包肉", 34));
foodsList.add(new Food("haomiganfanbazirou", "好米干饭把子肉", 45));
foodsList.add(new Food("jidanzhajiangmian", "鸡蛋炸酱面", 56));
foodsList.add(new Food("kaoquanyang", "烤全羊", 67));
foodsList.add(new Food("laobeijingchaogeda", "老北京炒疙瘩", 78));
foodsList.add(new Food("lizhirou", "荔枝肉", 89));
foodsList.add(new Food("niunaikekeqiu", "牛奶可可球", 90));
foodsList.add(new Food("peigenjinzhengu", "培根金针菇", 30));
foodsList.add(new Food("qincaixiarenshuijiao", "芹菜虾仁水饺", 37));
foodsList.add(new Food("qingmingtuanzi", "清明团子", 48));
foodsList.add(new Food("shufulei", "舒芙蕾", 39));
foodsList.add(new Food("wuxiangjianglvrou", "五香酱驴肉", 27));
foodsList.add(new Food("xianshaobai", "咸烧白", 14));
foodsList.add(new Food("xinjiangchaokaorou", "新疆炒烤肉", 28));
foodsList.add(new Food("xuedouduntihua", "雪豆炖蹄花", 10));
foodsList.add(new Food("yangzasui", "羊杂碎", 27));
foodsList.add(new Food("yerongtianjiangmaifen", "椰蓉甜姜麦芬", 16));
foodsList.add(new Food("zhenfengji", "蒸风鸡", 53));
} // 查找组件
private void initView() {
lv_foods = (ListView) findViewById(R.id.lv_foods);
bt_submit = (Button) findViewById(R.id.bt_submit);
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.menutest.MainActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="选择菜品" />
<ListView
android:id="@+id/lv_foods"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
</ListView>
<Button
android:id="@+id/bt_submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="OK" />
</LinearLayout>
Food.java
package com.example.menutest.bean; public class Food {
private String foodImageName;
private String foodName;
private int foodPrice;
private int foodCount;
public Food(String foodImageName, String foodName, int foodPrice, int foodCount) {
super();
this.foodImageName = foodImageName;
this.foodName = foodName;
this.foodPrice = foodPrice;
this.foodCount = foodCount;
}
public Food(String foodName, int foodPrice, int foodCount) {
super();
this.foodName = foodName;
this.foodPrice = foodPrice;
this.foodCount = foodCount;
}
public Food(String foodImageName, String foodName, int foodPrice) {
super();
this.foodImageName = foodImageName;
this.foodName = foodName;
this.foodPrice = foodPrice;
}
public Food() {
super();
}
public String getFoodImageName() {
return foodImageName;
}
public void setFoodImageName(String foodImageName) {
this.foodImageName = foodImageName;
}
public String getFoodName() {
return foodName;
}
public void setFoodName(String foodName) {
this.foodName = foodName;
}
public int getFoodPrice() {
return foodPrice;
}
public void setFoodPrice(int foodPrice) {
this.foodPrice = foodPrice;
}
public int getFoodCount() {
return foodCount;
}
public void setFoodCount(int foodCount) {
this.foodCount = foodCount;
}
}
ShowFoodAdapter.java
package com.example.menutest.adapter; import java.io.IOException;
import java.util.List; import com.example.menutest.R;
import com.example.menutest.bean.Food; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; public class ShowFoodAdapter extends BaseAdapter { private List<Food> mList;
private Context mContext;
private int foodCount;
private ViewHolder viewHolder; public ShowFoodAdapter(List<Food> list, Context context) {
this.mContext = context;
this.mList = list;
} @Override
public int getCount() {
return mList.size();
} @Override
public Object getItem(int position) {
return mList.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_show_foods, null);
viewHolder.iv_food_image = (ImageView) convertView.findViewById(R.id.iv_food_image);
viewHolder.tv_food_name = (TextView) convertView.findViewById(R.id.tv_food_name);
viewHolder.tv_food_price = (TextView) convertView.findViewById(R.id.tv_food_price);
viewHolder.et_food_count = (EditText) convertView.findViewById(R.id.et_food_count);
viewHolder.bt_minus = (Button) convertView.findViewById(R.id.bt_minus);
viewHolder.bt_plus = (Button) convertView.findViewById(R.id.bt_plus);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
} try {
Bitmap bitmap = BitmapFactory
.decodeStream(mContext.getAssets().open(mList.get(position).getFoodImageName() + ".jpg"));
viewHolder.iv_food_image.setImageBitmap(bitmap);
} catch (IOException e) {
Log.d("TTTT", "图片设置失败,位置:" + position);
e.printStackTrace();
} viewHolder.tv_food_name.setText(mList.get(position).getFoodName());
viewHolder.tv_food_price.setText(mList.get(position).getFoodPrice() + "元/份"); viewHolder.bt_minus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.et_food_count.setText(--foodCount + "");
}
}); viewHolder.bt_plus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolder.et_food_count.setText(++foodCount + "");
}
}); return convertView;
} // ViewHolder
class ViewHolder {
ImageView iv_food_image;
TextView tv_food_name, tv_food_price;
EditText et_food_count;
Button bt_minus, bt_plus;
} }
item_show_food.xml
<?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"
android:gravity="center"
android:orientation="horizontal" > <ImageView
android:id="@+id/iv_food_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bawangshizitou" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" > <TextView
android:id="@+id/tv_food_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="红烧肉" /> <TextView
android:id="@+id/tv_food_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="10" />
</LinearLayout> <Button
android:id="@+id/bt_minus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="-" /> <EditText
android:id="@+id/et_food_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0" /> <Button
android:id="@+id/bt_plus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="+" /> </LinearLayout>
但是点击+-按钮却没有效果,通过log发现foodCount值是随着点击按钮变化的,只是没有更新在UI上而已,添加并执行notifyDataSetChanged()方法之后,还是出现了问题,倒是可以修改EditText控件了,但是是修改的别的Item的,也就是说点了AItem中的按钮,BItem中的EditText改变了,并且滑动屏幕的话,也会随机改变。这招行不通,找别的办法,想想在点击的时候,传入position,然后根据position来修改控件内容。那么就需要自定义点击事件了。
ShowFoodAdapter.java
package com.example.menutest.adapter; import java.io.IOException;
import java.util.List; import com.example.menutest.R;
import com.example.menutest.bean.Food; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; public class ShowFoodAdapter extends BaseAdapter { private List<Food> mList;
private Context mContext;
// private int foodCount;
private ViewHolder viewHolder; public ShowFoodAdapter(List<Food> list, Context context) {
this.mContext = context;
this.mList = list;
} @Override
public int getCount() {
return mList.size();
} @Override
public Object getItem(int position) {
return mList.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_show_foods, null);
viewHolder.iv_food_image = (ImageView) convertView.findViewById(R.id.iv_food_image);
viewHolder.tv_food_name = (TextView) convertView.findViewById(R.id.tv_food_name);
viewHolder.tv_food_price = (TextView) convertView.findViewById(R.id.tv_food_price);
viewHolder.et_food_count = (EditText) convertView.findViewById(R.id.et_food_count);
viewHolder.bt_minus = (Button) convertView.findViewById(R.id.bt_minus);
viewHolder.bt_plus = (Button) convertView.findViewById(R.id.bt_plus);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
} try {
Bitmap bitmap = BitmapFactory
.decodeStream(mContext.getAssets().open(mList.get(position).getFoodImageName() + ".jpg"));
viewHolder.iv_food_image.setImageBitmap(bitmap);
} catch (IOException e) {
Log.d("TTTT", "图片设置失败,位置:" + position);
e.printStackTrace();
} viewHolder.tv_food_name.setText(mList.get(position).getFoodName());
viewHolder.tv_food_price.setText(mList.get(position).getFoodPrice() + "元/份");
// 直接从数据源中拿取数量,下面的按钮点击,直接修改数据源中的数据
viewHolder.et_food_count.setText(mList.get(position).getFoodCount() + ""); viewHolder.bt_minus.setOnClickListener(new ItemButtonOnClickListener(position));
viewHolder.bt_plus.setOnClickListener(new ItemButtonOnClickListener(position)); return convertView;
} // ViewHolder
class ViewHolder {
ImageView iv_food_image;
TextView tv_food_name, tv_food_price;
EditText et_food_count;
Button bt_minus, bt_plus; @Override
public String toString() {
return tv_food_name.getText().toString();
}
} class ItemButtonOnClickListener implements View.OnClickListener { private int position;
// 获取EditeText此时正显示的数量
private int foodCount = Integer.parseInt(viewHolder.et_food_count.getText().toString()); public ItemButtonOnClickListener(int position) {
this.position = position;
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_plus:
// 数量+1
foodCount++;
// 将数据源中的数量修改
mList.get(position).setFoodCount(foodCount);
// 刷新显示
notifyDataSetChanged();
break;
case R.id.bt_minus:
foodCount--;
if (foodCount <= 0) {
mList.get(position).setFoodCount(0);
} else {
mList.get(position).setFoodCount(foodCount);
}
notifyDataSetChanged();
break;
}
}
}
}
然后在提交菜单的时候又遇到问题了,我是使用for循环,配合ListView的getChildCount()和getChildAt()来获取修改了数量的菜品,但是发现这个方法只能获取到屏幕中显示的Item中的数据,而没有显示的Item则获取不到,直接使用下标来获取没有显示的Item的内容,会报空指针,QQ群里求助,被告知数据和界面要分开,也就是M层和V层要剥离开来,这种情况,可以直接在数据源下手,那么问题迎刃而解,数据是在Adapter中修改的,那么在Adapter中加一个直接返回修改后的数据源的方法不就行了!
ShowFoodAdapter.java
package com.example.menutest.adapter; import java.io.IOException;
import java.util.List; import com.example.menutest.R;
import com.example.menutest.bean.Food; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView; public class ShowFoodAdapter extends BaseAdapter { private List<Food> mList;
private Context mContext;
// private int foodCount;
private ViewHolder viewHolder; public ShowFoodAdapter(List<Food> list, Context context) {
this.mContext = context;
this.mList = list;
} // 返回修改过数量之后的List
public List getSelectedFoodList() {
return mList;
} @Override
public int getCount() {
return mList.size();
} @Override
public Object getItem(int position) {
return mList.get(position);
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
} @Override
public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) {
viewHolder = new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_show_foods, null);
viewHolder.iv_food_image = (ImageView) convertView.findViewById(R.id.iv_food_image);
viewHolder.tv_food_name = (TextView) convertView.findViewById(R.id.tv_food_name);
viewHolder.tv_food_price = (TextView) convertView.findViewById(R.id.tv_food_price);
viewHolder.et_food_count = (EditText) convertView.findViewById(R.id.et_food_count);
viewHolder.bt_minus = (Button) convertView.findViewById(R.id.bt_minus);
viewHolder.bt_plus = (Button) convertView.findViewById(R.id.bt_plus);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
} try {
Bitmap bitmap = BitmapFactory
.decodeStream(mContext.getAssets().open(mList.get(position).getFoodImageName() + ".jpg"));
viewHolder.iv_food_image.setImageBitmap(bitmap);
} catch (IOException e) {
Log.d("TTTT", "图片设置失败,位置:" + position);
e.printStackTrace();
} viewHolder.tv_food_name.setText(mList.get(position).getFoodName());
viewHolder.tv_food_price.setText(mList.get(position).getFoodPrice() + "元/份");
// 直接从数据源中拿取数量,下面的按钮点击,直接修改数据源中的数据
viewHolder.et_food_count.setText(mList.get(position).getFoodCount() + ""); viewHolder.bt_minus.setOnClickListener(new ItemButtonOnClickListener(position));
viewHolder.bt_plus.setOnClickListener(new ItemButtonOnClickListener(position)); return convertView;
} // ViewHolder
class ViewHolder {
ImageView iv_food_image;
TextView tv_food_name, tv_food_price;
EditText et_food_count;
Button bt_minus, bt_plus; @Override
public String toString() {
return tv_food_name.getText().toString();
}
} class ItemButtonOnClickListener implements View.OnClickListener { private int position;
// 获取EditeText此时正显示的数量
private int foodCount = Integer.parseInt(viewHolder.et_food_count.getText().toString()); public ItemButtonOnClickListener(int position) {
this.position = position;
} @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_plus:
// 数量+1
foodCount++;
// 将数据源中的数量修改
mList.get(position).setFoodCount(foodCount);
// 刷新显示
notifyDataSetChanged();
break;
case R.id.bt_minus:
foodCount--;
if (foodCount <= 0) {
mList.get(position).setFoodCount(0);
} else {
mList.get(position).setFoodCount(foodCount);
}
notifyDataSetChanged();
break;
}
}
}
}
MainActivity.java
package com.example.menutest; import java.io.Serializable;
import java.util.ArrayList;
import java.util.List; import com.example.menutest.adapter.ShowFoodAdapter;
import com.example.menutest.bean.Food; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView; public class MainActivity extends Activity { private ListView lv_foods;
private Button bt_submit;
private List<Food> foodsList = new ArrayList<Food>();
private ShowFoodAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); initView();
initData();
adapter = new ShowFoodAdapter(foodsList, this);
lv_foods.setAdapter(adapter); bt_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<Food> selectedFoodList = adapter.getSelectedFoodList();
Intent intent = new Intent(MainActivity.this, SelectFoodActivity.class);
intent.putExtra("selectFood", (Serializable) selectedFoodList);
startActivity(intent);
}
});
} // 初始化菜品数据
private void initData() {
foodsList.add(new Food("bawangshizitou", "霸王狮子头", 23));
foodsList.add(new Food("dongbeiguobaorou", "东北锅包肉", 34));
foodsList.add(new Food("haomiganfanbazirou", "好米干饭把子肉", 45));
foodsList.add(new Food("jidanzhajiangmian", "鸡蛋炸酱面", 56));
foodsList.add(new Food("kaoquanyang", "烤全羊", 67));
foodsList.add(new Food("laobeijingchaogeda", "老北京炒疙瘩", 78));
foodsList.add(new Food("lizhirou", "荔枝肉", 89));
foodsList.add(new Food("niunaikekeqiu", "牛奶可可球", 90));
foodsList.add(new Food("peigenjinzhengu", "培根金针菇", 30));
foodsList.add(new Food("qincaixiarenshuijiao", "芹菜虾仁水饺", 37));
foodsList.add(new Food("qingmingtuanzi", "清明团子", 48));
foodsList.add(new Food("shufulei", "舒芙蕾", 39));
foodsList.add(new Food("wuxiangjianglvrou", "五香酱驴肉", 27));
foodsList.add(new Food("xianshaobai", "咸烧白", 14));
foodsList.add(new Food("xinjiangchaokaorou", "新疆炒烤肉", 28));
foodsList.add(new Food("xuedouduntihua", "雪豆炖蹄花", 10));
foodsList.add(new Food("yangzasui", "羊杂碎", 27));
foodsList.add(new Food("yerongtianjiangmaifen", "椰蓉甜姜麦芬", 16));
foodsList.add(new Food("zhenfengji", "蒸风鸡", 53));
} // 查找组件
private void initView() {
lv_foods = (ListView) findViewById(R.id.lv_foods);
bt_submit = (Button) findViewById(R.id.bt_submit);
}
}
SelectFoodActivity.java
package com.example.menutest; import java.util.ArrayList;
import java.util.List; import com.example.menutest.bean.Food; import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView; public class SelectFoodActivity extends Activity { private ListView lv_select_food;
private TextView tv_money_count;
private ArrayAdapter<String> adapter;
private int moneyCount;
private List<String> list = new ArrayList<String>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_select_food); initView();
Intent intent = getIntent();
List<Food> selectFood = (List<Food>) intent.getSerializableExtra("selectFood");
for (int i = 0; i < selectFood.size(); i++) { if (selectFood.get(i).getFoodCount() == 0) {
continue;
} else {
list.add(selectFood.get(i).getFoodName() + ",共 " + selectFood.get(i).getFoodCount() + " 份,每份 "
+ selectFood.get(i).getFoodPrice() + " 元");
moneyCount += selectFood.get(i).getFoodPrice() * selectFood.get(i).getFoodCount();
}
}
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
lv_select_food.setAdapter(adapter);
tv_money_count.setText("共计: " + moneyCount + " 元");
} private void initView() {
lv_select_food = (ListView) findViewById(R.id.lv_select_food);
tv_money_count = (TextView) findViewById(R.id.tv_money_count);
} }
至此,功能完成,当然还有很多需要优化的地方,譬如界面,因为仅仅是说明一下思路,这里就不展开了,回头有时间写个完整的。
Android笔记(七十六) 点菜DEMO的更多相关文章
- Android笔记(七十四) 详解Intent
我们最常使用Intent来实现Activity之间的转跳,最近做一个app用到从系统搜索图片的功能,使用到了intent的 setType 方法和 setAction 方法,网上搜索一番,发现实现转跳 ...
- Android笔记(七十五) Android中的图片压缩
这几天在做图记的时候遇第一次遇到了OOM,好激动~~ 追究原因,是因为在ListView中加载的图片太大造成的,因为我使用的都是手机相机直接拍摄的照片,图片都比较大,所以在加载的时候会出现内存溢出,那 ...
- Android笔记(七十二) Style和Theme
我们尝尝需要使用setText.setColor.setTextSize等属性来设置控件的样式,但是每个控件都需要设置这些属性,工作量无疑是巨大的,并且后期维护起来也不方便. Style Androi ...
- Android笔记(七十) AlertDialog
alertdialog可以在当前界面中弹出一个对话框,这个对话框在界面所有元素之上,可以屏蔽掉其他控件的交互能力,因此alertdialog常用于一些重要的内容警告. 使用AlertDialog.Bu ...
- Android笔记(十六) 简易计算器
实现功能: 简单计算器 布局及美化 采用LinearLayout嵌套LinearLayout实现布局. 要求 1. 按钮所有文字居于右下角 2. 按钮为白色,点击变成橘色 3. 显示屏文字居右显示并且 ...
- Nodejs学习笔记(十六)--- Pomelo介绍&入门
目录 前言&介绍 安装Pomelo 创建项目并启动 创建项目 项目结构说明 启动 测试连接 聊天服务器 新建gate和chat服务器 配置master.json 配置servers.json ...
- ng机器学习视频笔记(十六) ——从图像处理谈机器学习项目流程
ng机器学习视频笔记(十六) --从图像处理谈机器学习项目流程 (转载请附上本文链接--linhxx) 一.概述 这里简单讨论图像处理的机器学习过程,主要讨论的是机器学习的项目流程.采用的业务示例是O ...
- Nodejs学习笔记(十六)—Pomelo介绍&入门
前言&介绍 Pomelo:一个快速.可扩展.Node.js分布式游戏服务器框架 从三四年前接触Node.js开始就接触到了Pomelo,从Pomelo最初的版本到现在,总的来说网易出品还算不错 ...
- 《HTTP 权威指南》笔记:第十六章&第十七章 国际化、内容协商与转码
<HTTP 权威指南>笔记:第十六章 国际化 客户端通过在请求报文中的 Accept-Language 首部和 Accept-Charset 首部来告知服务器:“我理解这些语言.”服务器通 ...
随机推荐
- Sword 位运算取余操作
/* 位运算取余操作 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...
- 移动端Web框架
[参考]移动端 UI设计尺寸(一)篇 [参考]移动端界面设计之尺寸篇 [参考]介绍几个移动web app开发框架 [参考]移动webapp前端ui用哪个框架好 H5 做移动开发也分两种,一种就是正常的 ...
- Ubuntu下卸载anaconda
转载:https://blog.csdn.net/m0_37407756/article/details/77968724(一)删除整个anaconda目录: 由于Anaconda的安装文件都包含在一 ...
- intellij查找接口的实现类
拿MyBatis的SqlSession为例 第一步:先找到这个接口 第二步:右击选择 再选择 第三步: 会得到如下 右击Closeable,因为SqlSession实现了它,选择Show Inplem ...
- MNN配置
1.github链接:https://github.com/alibaba/MNN/tree/master/tools/converter 2.教程 (1)使用教程:https://www.books ...
- Unity3D 使用SQLite
使用Unity操作SQLite,需要用到三个库文件,分别是Mono.Data.Sqlite.dll和System.Data.dll和Sqlite3.dll,前两个库文件可以在unity中找到,具体步骤 ...
- docker创建mysql5.7.22并配置主从
debian系统 安装docker (参考网址:https://cloud.tencent.com/developer/article/1360720) 1.更新现有的包列表 sudo apt upd ...
- 使用HOSTNAMECTL配置主机名
hostnamectl工具是用来管理给定主机中. 查看所有主机名 请运行下面的命令查看所有当前主机名: 〜] $ hostnamectl status 如果未指定任何选项,默认则使用status选项对 ...
- Python的编码规范
7. 什么是 PEP8? 8号Python增强提案,是针对Python代码格式而编写的风格指南 8. 了解 Python 之禅么? 通过 import this 语句可以获取其具体的内容.它告诉大家何 ...
- linux减少服务器带宽的方法
linux减少服务器带宽的方法用百度静态资源公共库http://cdn.code.baidu.com/ 不仅可以不使用服务器流量 而且还有cdn加速比方说http://apps.bdimg.com/l ...